多生产者关闭 Goroutine

在本篇文章中,将介绍如何在多个生产者完成生产后关闭 goroutine.

在编程中,我们会遇到多个生产者,单一消费者的场景。

在这种情况下,工作流会分为了两个 stage:

  • Stage 1: 多个生产者并发地计算结果,并将结果传入 channel
  • Stage 2: 消费者从 channel 中读取结果,做下一步的计算

在两个 stage 完成工作后程序自然退出,因此需要在所有生产者完成工作后,关闭 channel。消费者在 channel 关闭后,结束运行并退出。

为了保证所有生产者,使用 sync.WaitGroup.

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func Demo() {
ch := make(chan int)
workN := 5 // 生产者数
var wg sync.WaitGroup
wg.Add(workN)

// stage1
for i := 0; i < workN; i++ {
go func(i int) {
n := i * i
ch <- n
wg.Done()
}(i)
}

// close channel
go func() {
wg.Wait()
close(ch)
}()

// stage 2
for i := range ch {
fmt.Println(i)
}
}

首先是 stage1,启动多个 Goroutine,通过闭包将 wg 传入,并且在完成任务后调用 wg.Done()。

然后启动另一个 Goroutine 用来关闭 channel,这个 Goroutine 会阻塞,直到所有的任务完成,最后关闭 channel。

最后就是 stage2,不停地从 channel 中读取数据,直到 channel 关闭,然后结束程序。

这样就完成了一个多生产者场景下 channel 关闭的问题了。


多生产者关闭 Goroutine
https://blog.zhangliangliang.cc/post/close-goroutines.html
作者
Bobby Zhang
发布于
2021年6月25日
许可协议