背景

当我们在使用其他语言时,为了减少线程的创建与销毁的开销,一般都会创建一个线程池来高效管理线程。

而在golang中,利用goroutine与channel,我们可以高效的管理我们的任务,实现一个类似的goroutine pool十分简单

实现

// 开启一定数量的goroutine执行工作
for i := 0; i < worker; i++ {
    go startWorker(args, jobs, results)
}
// 将任务发送到jobs
for j := 1; j <= 9; j++ {
    jobs <- j
}
close(jobs)
// 获取任务结果,附加值是这一步可以保证所有goroutine执行完毕 程序才退出
for a := 1; a <= 9; a++ {
    <-results
}
// 工作代码从jobs中获取任务参数,将执行结果发送给results
func startWorker(args, jobs, results) {
    for j := range jobs {
       .....
       results <- xxx
    }
}

这样子,我们就实现了一个goroutine pool,当job channel中有任务时,goroutine执行任务,否则阻塞