golang协程工作池处理多任务示例

打印 上一主题 下一主题

主题 959|帖子 959|积分 2877

1. 工作方法实现
  1. // 工作线程
  2. // id : 线程号
  3. // jobs : 任务通道 (chan)
  4. // results: 完成结果通道 (chan)
  5. func worker(id int, jobs <-chan int, results chan<- int) {
  6.         //遍历任务
  7.         for j := range jobs {
  8.                 fmt.Println("工作协程: ", id, "启动任务: ", j)
  9.                 fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
  10.                 time.Sleep(time.Second)
  11.                 fmt.Println("工作协程: ", id, "结束任务", j)
  12.                 results <- j * 2 //任务完成后写入结果到通道
  13.         }
  14. }
复制代码
2.创建任务通道与任务执行结果通道
  1. const numJobs = 5                  //通道容量
  2.         jobarr := make(chan int, numJobs)  //任务通道
  3.         results := make(chan int, numJobs) //任务执行结果通道
复制代码
3.创建协程工作池
  1. //启动3个工作协程
  2.         for w := 1; w <= 3; w++ {
  3.                 go worker(w, jobarr, results)
  4.         }
复制代码
4.向工作通道发送任务
  1. //向任务通道发送5个任务
  2.         for j := 1; j <= numJobs; j++ {
  3.                 jobarr <- j //发送任务到任务通道
  4.         }
  5.         close(jobarr) //关闭任务通道
复制代码
5.遍历执行结果:
  1. //遍历执行结果
  2.         for a := 1; a <= numJobs; a++ {
  3.                 <-results //读取通道数据不做处理
  4.         }
复制代码
6.完备示例
  1. // 工作线程
  2. // id : 线程号
  3. // jobs : 任务通道 (chan)
  4. // results: 完成结果通道 (chan)
  5. func worker(id int, jobs <-chan int, results chan<- int) {
  6.         //遍历任务
  7.         for j := range jobs {
  8.                 fmt.Println("工作协程: ", id, "启动任务: ", j)
  9.                 fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
  10.                 time.Sleep(time.Second)
  11.                 fmt.Println("工作协程: ", id, "结束任务", j)
  12.                 results <- j * 2 //任务完成后写入结果到通道
  13.         }
  14. }const numJobs = 5                  //通道容量
  15.         jobarr := make(chan int, numJobs)  //任务通道
  16.         results := make(chan int, numJobs) //任务执行结果通道        //启动3个工程协程        for w := 1; w <= 3; w++ {                go worker(w, jobarr, results)        }        //向任务通道发送5个任务
  17.         for j := 1; j <= numJobs; j++ {
  18.                 jobarr <- j //发送任务到任务通道
  19.         }
  20.         close(jobarr) //关闭任务通道        //遍历执行结果
  21.         for a := 1; a <= numJobs; a++ {
  22.                 <-results //读取通道数据不做处理
  23.         }
复制代码
输出结果:
  1. 工作协程:  3 启动任务:  1
  2. >>>>>>休眠2秒,模拟工作处理数据中...
  3. 工作协程:  2 启动任务:  2
  4. >>>>>>休眠2秒,模拟工作处理数据中...
  5. 工作协程:  1 启动任务:  3
  6. >>>>>>休眠2秒,模拟工作处理数据中...
  7. 工作协程:  2 结束任务 2
  8. 工作协程:  2 启动任务:  4
  9. >>>>>>休眠2秒,模拟工作处理数据中...
  10. 工作协程:  3 结束任务 1
  11. 工作协程:  3 启动任务:  5
  12. >>>>>>休眠2秒,模拟工作处理数据中...
  13. 工作协程:  1 结束任务 3
  14. 工作协程:  3 结束任务 5
  15. 工作协程:  2 结束任务 4
复制代码
执行流程示例图:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表