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
执行流程示例图: