Завершение работы «рабочего» происходит после того, как буфер опустеет
Я хочу, чтобы мой рабочий рутина (ProcessToDo()
в приведенном ниже коде), чтобы дождаться обработки всей «поставленной в очередь» работы перед завершением работы.
Рабочая подпрограмма имеет канал «делать» (буферизованный), по которому на нее отправляется работа. И у него есть «готовый» канал, чтобы сказать ему начать выключение. В документации говорится, что выборка на каналах выберет «псевдослучайное значение», если выполнено более одного выбора ... это означает, что отключение (возврат) запускается до завершения всей буферизованной работы.
В приведенном ниже примере кода я хочу напечатать все 20 сообщений ...
package main
import (
"time"
"fmt"
)
func ProcessToDo(done chan struct{}, todo chan string) {
for {
select {
case work, ok := <-todo:
if !ok {
fmt.Printf("Shutting down ProcessToDo - todo channel closed!\n")
return
}
fmt.Printf("todo: %q\n", work)
time.Sleep(100 * time.Millisecond)
case _, ok := <-done:
if ok {
fmt.Printf("Shutting down ProcessToDo - done message received!\n")
} else {
fmt.Printf("Shutting down ProcessToDo - done channel closed!\n")
}
close(todo)
return
}
}
}
func main() {
done := make(chan struct{})
todo := make(chan string, 100)
go ProcessToDo(done, todo)
for i := 0; i < 20; i++ {
todo <- fmt.Sprintf("Message %02d", i)
}
fmt.Println("*** all messages queued ***")
time.Sleep(1 * time.Second)
close(done)
time.Sleep(4 * time.Second)
}