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 个工作人员发出信号,表示他们可以通过将他们从循环范围内删除来退出工作循环。