IT评测·应用市场-qidao123.com
标题:
golang协程工作池处理多任务示例
[打印本页]
作者:
美丽的神话
时间:
2024-6-14 22:44
标题:
golang协程工作池处理多任务示例
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4