我想限制创建的goroutine的最大数量,以避免创建太多的goroutine。我们可以通过使用下面的东西来实现同样的目的:
var g errgroup.Group
g.SetLimit(10)
for i := 0; i < 1000000; i++ {
i := i
g.Go(func() error {
task(i) //long running task with I/O
return nil
})
}
g.Wait()
字符串
我在上面创建了一个10个goroutine的限制。下一个goroutine(也就是第11个)只有在前10个goroutine中的一个完成任务时才会运行。但是我希望第11个goroutine也能在任何goroutine进入等待状态时运行。
我怎么能在这里做到这一点?
1条答案
按热度按时间iyzzxitl1#
如果你想限制整个程序的线程数量,那么设置GOMAXPROCS是正确的。但是,如果你想限制程序某个部分的并发,那么你可以产生特定数量的worker,然后使用通道与它们通信。
下面是一个示例:
字符串
希望这有帮助!