Go工作池

【Go工作池】工作池是一种设计, 其中固定数量的m个工作程序(Go goroutines)在工作队列(工作通道)中的n个任务上工作。工作一直排在队列中, 直到工作人员完成其当前任务并提出新任务为止。
让我们看一个例子

package mainimport ( "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个工作人员发出信号, 表明他们可以通过将其退出循环范围而退出工作循环。

    推荐阅读