work_pool 协程池实现
work_pool 协程池, 工作池
在工作中我们通常会使用可以指定启动的goroutine
数量worker pool
模式,控制goroutine
的数量,防止goroutine
泄漏和暴涨。
一个简易的work pool
示例代码如下:
package main
import (
"fmt"
"time"
)
//var g sync.WaitGroup
func worker(id int, project chan int, result chan int) {
for j := range project {
fmt.Printf("worker:%d,start job:,%d\n", id, j)
time.Sleep(time.Second)
result <- j * 2
}
}
func res(res chan int) {
for {
fmt.Printf("任务执行完毕,结果%d\n", <-res)
}
}
func main() {
project := make(chan int, 100)
result := make(chan int)
// 携程池 启动三个携程
for i := 0; i <= 3; i++ {
go worker(i, project, result)
}
// 生产五个任务 先执行完的协程会自动过取任务
for j := 0; j <= 5; j++ {
project <- j
}
// 取出结果
go res(result)
time.Sleep(time.Second * 3)
}
}