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