1. 工作方法实现
- // 工作线程
- // id : 线程号
- // jobs : 任务通道 (chan)
- // results: 完成结果通道 (chan)
- func worker(id int, jobs <-chan int, results chan<- int) {
- //遍历任务
- for j := range jobs {
- fmt.Println("工作协程: ", id, "启动任务: ", j)
- fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
- time.Sleep(time.Second)
- fmt.Println("工作协程: ", id, "结束任务", j)
- results <- j * 2 //任务完成后写入结果到通道
- }
- }
复制代码 2.创建任务通道与任务执行结果通道
- const numJobs = 5 //通道容量
- jobarr := make(chan int, numJobs) //任务通道
- results := make(chan int, numJobs) //任务执行结果通道
复制代码 3.创建协程工作池
- //启动3个工作协程
- for w := 1; w <= 3; w++ {
- go worker(w, jobarr, results)
- }
复制代码 4.向工作通道发送任务
- //向任务通道发送5个任务
- for j := 1; j <= numJobs; j++ {
- jobarr <- j //发送任务到任务通道
- }
- close(jobarr) //关闭任务通道
复制代码 5.遍历执行结果:
- //遍历执行结果
- for a := 1; a <= numJobs; a++ {
- <-results //读取通道数据不做处理
- }
复制代码 6.完备示例
- // 工作线程
- // id : 线程号
- // jobs : 任务通道 (chan)
- // results: 完成结果通道 (chan)
- func worker(id int, jobs <-chan int, results chan<- int) {
- //遍历任务
- for j := range jobs {
- fmt.Println("工作协程: ", id, "启动任务: ", j)
- fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
- time.Sleep(time.Second)
- fmt.Println("工作协程: ", id, "结束任务", j)
- results <- j * 2 //任务完成后写入结果到通道
- }
- }const numJobs = 5 //通道容量
- jobarr := make(chan int, numJobs) //任务通道
- results := make(chan int, numJobs) //任务执行结果通道 //启动3个工程协程 for w := 1; w <= 3; w++ { go worker(w, jobarr, results) } //向任务通道发送5个任务
- for j := 1; j <= numJobs; j++ {
- jobarr <- j //发送任务到任务通道
- }
- close(jobarr) //关闭任务通道 //遍历执行结果
- for a := 1; a <= numJobs; a++ {
- <-results //读取通道数据不做处理
- }
复制代码 输出结果:
- 工作协程: 3 启动任务: 1
- >>>>>>休眠2秒,模拟工作处理数据中...
- 工作协程: 2 启动任务: 2
- >>>>>>休眠2秒,模拟工作处理数据中...
- 工作协程: 1 启动任务: 3
- >>>>>>休眠2秒,模拟工作处理数据中...
- 工作协程: 2 结束任务 2
- 工作协程: 2 启动任务: 4
- >>>>>>休眠2秒,模拟工作处理数据中...
- 工作协程: 3 结束任务 1
- 工作协程: 3 启动任务: 5
- >>>>>>休眠2秒,模拟工作处理数据中...
- 工作协程: 1 结束任务 3
- 工作协程: 3 结束任务 5
- 工作协程: 2 结束任务 4
复制代码 执行流程示例图:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |