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
執行流程示例圖: