📅  最后修改于: 2021-01-02 09:10:26             🧑  作者: Mango
工作池是一种设计,其中固定数量的m个工作程序(Go goroutines)在工作队列(工作通道)中的n个任务上工作。工作一直排在队列中,直到工人完成其当前任务并提出新任务为止。
让我们看一个例子
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second)
results <- j * 2
}
}
func main() {
job := make(chan int, 10)
result := make(chan int, 10)
for w := 1; w <= 2; w++ {
go worker(w, job, result)
}
for j := 1; j <= 9; j++ {
job <- j
}
close(job)
for a := 1; a <= 9; a++ {
<-result
}
}
输出:
worker 2 processing job 1
worker 1 processing job 2
worker 2 processing job 3
worker 1 processing job 4
worker 1 processing job 5
worker 2 processing job 6
worker 1 processing job 7
worker 2 processing job 8
在此示例中,启动了2个工作人员,并将9个工作项放到了工作渠道中。工人们有一个带时间的工作循环,然后睡觉,每个人最终只能工作2个工作。在完成所有工作之后,在通道上使用close,这向所有2个工作人员发出信号,表明他们可以通过将他们退出循环范围而退出工作循环。