下面的代码有一个明显的问题:程序会在工人完成所有工作之前退出。
在发送者开始发送数据之前,worker 的 Goroutines 被启动,数据必须保留。从 sender 函数启动这些 goroutine 不是一种选择。这样做很容易,但是需要学习更复杂的同步技术。
等待工人完成的正确方法是什么?
尝试关闭worker1CH和worker2CH通道,以及为每个工作人员添加专用的 sync.WaitGroups。
package main
import (
"log"
"math/rand"
"sync"
)
func main() {
worker1CH := make(chan int, 1)
worker2CH := make(chan int, 1)
// worker for even numbers
go func(in chan int) {
for i := range in {
log.Print(i)
}
}(worker1CH)
// worker for odd numbers
go func(in chan int) {
for i := range in {
log.Print(i)
}
}(worker2CH)
// sender which sends even numbers to worker1CH, and odd numbers to worker2CH
var wg sync.WaitGroup
wg.Add(1)
go func(wg *sync.WaitGroup, evenChan chan int, oddChan chan int) {
defer wg.Done()
data := rand.Perm(10)
for _, i := range data {
switch i%2 {
case 0:
evenChan <- i
default:
oddChan <- i
}
}
}(&wg, worker1CH, worker2CH)
wg.Wait()
}
慕田峪7331174
POPMUISE
largeQ
相关分类