channel
当有多个管道均可操作时, select 会随机选择一个管道。基于该特性我们可以用 select 实现一个生成随机数序列的程序:
我们通过 select 和 default 分支可以很容易实现一个Goroutine的退出控制:
但是管道的发送操作和接收操作是一一对应的,如果要停止多个Goroutine那么可能需要创建同样数量 的管道,这个代价太大了。其实我们可以通过 close 关闭一个管道来实####现广播的效果,所有从关闭管 道接收的操作均会收到一个零值和一个可选的失败标志
我们通过 close 来关闭 cancel 管道向多个Goroutine广播退出的指令。不过这个程序依然不够 稳健:当每个Goroutine收到退出指令退出时一般会进行一定的清理工作,####但是退出的清理工作并不能 保证被完成,因为 main 线程并没有等待各个工作Goroutine退出工作完成的机制。我们可以结 合 sync.WaitGroup 来改进:
现在每个工作者并发体的创建、运行、暂停和退出都是在 main 函数的安全控制之下了。