2 回答
TA贡献1798条经验 获得超7个赞
我刚刚尝试过(操场)通过 awg *sync.WaitGroup并且它有效。
传递sync.WaitGroup意味着传递sync.WaitGroup(按值传递)的副本:goroutine 提到Done()了不同的 sync.WaitGroup.
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go worker(intInputChan, &wg)
}
请注意&wg:您正在按值传递指向原始 的指针sync.WaitGroup,供 goroutine 使用。
TA贡献1828条经验 获得超3个赞
如所提到的,不从同步绕包传值的类型,右靠近的顶部sync
包文档:“含有在此包中定义的类型的值不应该被复制。 ”这也包括类型本身(sync.Mutex
,sync.WaitGroup
等)。
但是,有几个注意事项:
wg.Add
如果您知道要添加多少个,您可以只使用一次调用(但如文档所示,请确保在任何调用之前都已完成Wait
)。你不想那样打电话
runtime.Gosched
;它使工人忙循环。您可以使用
range
从通道读取以简化在关闭时停止的过程。对于小函数,您可以使用闭包,而根本不需要传递通道或等待组。
这变成了这样:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
const numWorkers = 3
c := make(chan int, 10)
var wg sync.WaitGroup
wg.Add(numWorkers)
for i := 0; i < numWorkers; i++ {
go func() {
defer func() {
fmt.Println("Executing defer…")
wg.Done()
}()
for v := range c {
fmt.Println("recv:", v)
time.Sleep(100 * time.Millisecond)
}
}()
}
for i := 1; i < 51; i++ {
fmt.Println("send:", i)
c <- i
}
fmt.Println("closing…")
close(c)
fmt.Println("waiting…")
wg.Wait()
fmt.Println("Exiting Main App... ")
}
- 2 回答
- 0 关注
- 222 浏览
添加回答
举报