```golang
package main
import (
"fmt"
"time"
)
// 在这个例子中,我们将看到如何使用goroutine 和channel实现一个_工作池_
// 工作池是我们将要在并发实例中支持的任务了,这些执行者将从`jobs`通道接受任务,
// 并且通过`result`发送对应的结果。
// 工作池
func worker(id int, jobs <-chan int, result chan<- int) {
for j := range jobs {
fmt.Println("worker : ", id, "processing job ", j)
time.Sleep(time.Second * 2) // 构建耗时2s的任务
result <- j * 2
}
}
func main() {
//为了使用worker工作池并收集他们的结果,我们需要2个chan
jobs := make(chan int, 100)
result := make(chan int, 100)
// 这里启动了3个worker,初始是阻塞的,因为还没有传递任务
for i := 0; i < 3; i++ {
go worker(i, jobs, result)
}
//这里我们发送9个`jobs`,
//然后close这些chan表示这些就是所有的任务了
for j := 0; j < 9; j++ {
jobs <- j
}
close(jobs)
//最后,我们收集这些任务的返回值
for a := 1; a <= 9; a++ {
<-result
}
}
```
有疑问加站长微信联系(非本文作者))