Goroutine 池
通常情况下,我们可以认为因为 goroutine 代价极小,因此可以无脑使用 goroutine 跑协程
但是考虑到一些操作可能仍然需要有一个并发度的限制,在这里可以考虑实现一个 Goroutine 池
如果我们限定池子大小为 16,那么最多只会有 16 个协程正在执行,超出该数量就会被处于等待状态
代码本身容易实现,大致思路就是启动时就启动对应数量个协程,并循环等待 channel 发来的任务,当有协程需要执行时,通过 channel 发送即可
由于本身 goroutine 的消耗极小,且 select 状态会被阻塞等待,因此在未使用时,可以近似认为不占用资源
package pool // Pool is goroutine pool type Pool struct { cap int8 running int8 channel chan Func } // Func is gorouting function type Func func() // New returns a gorouting pool func New(cap int) *Pool { p := &Pool{ channel: make(chan Func, cap), } for i := 0; i < cap; i++ { go p.Thread() } return p } // Thread is the backend threading func (p *Pool) Thread() { for { select { case f := <-p.channel: f() } } } // Do a threading func (p *Pool) Do(f Func) { p.channel <- f } var pool = New(32) // Do a threading func Do(f Func) { pool.Do(f) }