Go Worker Pools基础教程文档
收录于 2023-04-20 00:10:05 · بالعربية · English · Español · हिंदीName · 日本語 · Русский язык · 中文繁體
Go Worker Pools
Worker Pools 是一种设计,其中固定数量的 m 个工人(Go goroutines)处理工作队列(Go 通道)中的 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 个工作项放入作业通道。工人有一个带 time.Sleep 的工作循环,这样每个人最终都会做 2 份工作。 close 用于在所有工作完成后在通道上使用,这向所有 2 个工作人员发出信号,表示他们可以通过将他们从循环范围内删除来退出工作循环。