034_go语言中的工作池

代码演示

package main

import "fmt"
import "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() {
	jobs := make(chan int, 100)
	results := make(chan int, 100)
	for w := 1; w <= 3; w++ {
		go worker(w, jobs, results)
	}
	for j := 1; j <= 9; j++ {
		jobs <- j
	}
	close(jobs)
	for a := 1; a <= 9; a++ {
		<-results
	}
}

  

代码运行结果

worker 3 processing job 1
worker 2 processing job 3
worker 1 processing job 2
worker 3 processing job 4
worker 1 processing job 5
worker 2 processing job 6
worker 1 processing job 8
worker 2 processing job 7
worker 3 processing job 9

  

代码解读

  • 工作池可以用go协程和通道实现
  • 以上例子创造了一个工作池,工作者从通道jobs里领取任务,做完以后将结果发送到results中
  • 为了使用工作池,需要总共两个通道,一个用来传输任务,一个用来传输结果
  • 上面例子中,启动了3个工作者,一开始是阻塞的,因为还没有传输任务
  • 后面往jobs中发送了总共9个任务,然后close掉通道表示这是所有任务了
  • 最后收集所有任务的返回值
posted @ 2018-04-16 23:13  Joestar  阅读(342)  评论(0编辑  收藏  举报