close位置问题
错误用法
cancel := make(chan bool)
// 控制并发数为10
limit := make(chan bool, 10)
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
limit <- true
fmt.Println("limit len",len(limit))
go Worker2(i, cancel, &wg, limit)
fmt.Println("===========" + strconv.Itoa(i) + "=============")
}
//我们通过close来关闭cancel管道向多个Goroutine广播退出的指令
fmt.Println("done:",Counter)
wg.Wait()
close(cancel)
正确用法
- close()得在wait前面
close(cancel)
wg.Wait()
控制每秒并发多个
- 添加 time.Sleep(time.Second)
cancel := make(chan bool)
// 控制并发数为10
limit := make(chan bool, 10)
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
limit <- true
fmt.Println("limit len",len(limit))
go func(i int) {
defer wg.Done()
log.Println(i)
// 控制每秒并发10个
time.Sleep(time.Second)
// 注意limit的位置,放在最后
<-limit
}(i)
}
fmt.Println("done:",Counter)
wg.Wait()
close(cancel)
原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/2061/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/