使用range从channel读数据

当需要从通道中读取多个值时,使用range是常用模式:
package main
import (
"fmt"
)
func foo(ch chan int) {
ch <- 1
ch <- 2
close(ch)
}
func main() {
ch := make(chan int)
go foo(ch)
for n := range ch {
fmt.Println(n)
}
fmt.Println("channel is now closed")
}
---------Output---------
1
2
channel is now closed
使用for range循环是从通道读取数据的三种方式之一。
通道被关闭后循环也会随即终止。
这是实现工作者协程池的常用模式:
  • 创建单个通道供所有工作者协程使用
  • 启动工作者协程
  • 工作者协程中使用for v := range chan从通道中获取作业进行处理
  • 在所有作业入队之后关闭通道,因此所有工作者协程也会在它们处理完通道中的作业后结束