工作池是一种设计,其中固定数量的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 } }
输出:
链接:https://www.learnfk.comhttps://www.learnfk.com/go/go-worker-pools.html
来源:LearnFk无涯教程网
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个工作人员发出信号,表明他们可以通过将他们退出循环范围而退出工作循环。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)