在 golang 里面大家应该都知道是 go 关键字调用一个函数,就开启了个线程。 如果一个循环,每个里面都调用 go 函数,那就会可能启动很多个线程, 如果想控制固定线程数来处理业务,该怎么写呢?

写过 golang 多线程的应该都知道,多线程之间可以通过管道通信协作,作为通信的数据。 我们可以通过 sync.WaitGroup 和管道配合来达到控制多线程的线程数。

代码

上面这个代码控制了 5 (MAX_THREADS) 个线程,你可以修改成 2 和 10 看下效果。

sync.WaitGroup 是一个线程控制组, 它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine 执行完成。

它一共有 3 个方法,Add(),Done(),Wait()。

Add - 设置需要阻塞的线程数 Done - 代表单线程已经执行完毕 Wait - 等待所有线程执行完毕的阻塞方法

通过它就可以控制多少个消费者同时在处理了,而不是生成无限多个消费者。