使用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从通道中获取作业进行处理

  • 在所有作业入队之后关闭通道,因此所有工作者协程也会在它们处理完通道中的作业后结束

最后更新于