如何控制goroutine的数量

请尝试在评论区里写下答案(如不能清楚表述,那么你可能没真正理解)。欢迎参与,为下一次求职做准备。
  • 利用 channel 的缓存区
  • 协程池控制 第三方库资源库如:Jeffail/tunny panjf2000/ants
  • 调整系统资源的上限
    • ulimit 操作系统通常会限制同时打开文件数量、栈空间大小等,ulimit -a 可以看到系统当前的设置
    • 虚拟内存(virtual memory) 虚拟内存是在内存不足时,将磁盘映射为内存使用 如 linux 的swap space

请尝试在评论区里写下你的答案(如不能清楚表述,那么你可能没真正理解)。
欢迎参与,为下一次求职做准备。

滴水穿石,石破天惊----晓疯子
zhaocrazy
讨论数量: 2
func main() {
    concurrent := 1                               // 并发数量,当数量>1时,就会并发处理
    throttleCh := make(chan struct{}, concurrent) // 截流通道
    var cnt int32
    for {
        throttleCh <- struct{}{}

        go func() {
            atomic.AddInt32(&cnt, 1)
            job(atomic.LoadInt32(&cnt))
            <-throttleCh
        }()
    }
}

func job(index int32) {
    log.Println(index, "begin doing something")
    time.Sleep(time.Duration(rand.Intn(5) * int(time.Second)))
    log.Println(index, "done")
}
1年前 评论
franktrue

在Go语言中,可以使用一些机制来控制Goroutine的数量,以避免并发过高导致资源耗尽或性能下降的问题。以下是几种常见的控制Goroutine数量的方法:

  1. 使用有缓冲的通道(Buffered Channel):可以创建一个有限容量的通道,并在启动Goroutine之前将一定数量的令牌放入通道中。每个Goroutine在执行之前需要从通道中获取一个令牌,当通道中没有令牌可用时,新的Goroutine将被阻塞。这样可以限制并发执行的Goroutine数量。
  2. 使用 sync.WaitGroup:sync.WaitGroup 是一个计数器,用于等待一组Goroutine完成任务。可以通过调用 Add() 方法增加计数器值,在每个Goroutine完成任务后调用 Done() 方法减少计数器值。主函数可以调用 Wait() 方法来等待所有计数器归零,从而控制并发执行的Goroutine数量。
  3. 使用线程池(Worker Pool):可以创建一个固定大小的线程池,并将任务分配给池中的工作线程(即Goroutine)。通过限制线程池大小,可以控制同时执行任务的Goroutine数量。
  4. 使用有限并发控制结构:例如使用带有信号量或互斥锁等机制来限制并发执行的Goroutine数量。可以通过控制信号量或互斥锁的状态来决定是否允许新的Goroutine执行。

需要根据具体场景和需求选择适合的方法来控制Goroutine的数量。通过合理地控制并发度,可以避免资源竞争、提高程序性能,并确保系统资源的有效利用。

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!