我希望我的 go 例程工作人员(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)
}
Smart猫小萌
慕莱坞森
拉莫斯之舞
相关分类