思路:把任務放到通道channel里面channel,每個線程從通道取出任務,并且把執行結果寫到另外一個通道
示例1
```
package main
import (
"fmt"
"time"
)
//這個是工作線程,處理具體的業務邏輯,將jobs中的任務取出,處理后將處理結果放置在results中。
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second)
results <- j * 2
}
}
func main() {
//兩個channel,一個用來放置工作項,一個用來存放處理結果。
jobs := make(chan int, 100)
results := make(chan int, 100)
// 開啟三個線程,也就是說線程池中只有3個線程,實際情況下,我們可以根據需要動態增加或減少線程。
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 添加9個任務后關閉Channel
// channel to indicate that's all the work we have.
for j := 1; j <= 9; j++ {
jobs <- j
}
close(jobs)
//獲取所有的處理結果
for a := 1; a <= 9; a++ {
<-results
}
}
```
- 安裝開發環境
- 安裝開發環境
- 安裝詳細教程
- 引入包
- Go語言基礎
- 基本變量與數據類型
- 變量
- 數據類型
- 指針
- 字符串
- 代碼總結
- 常量與運算符
- 常量
- 運算符
- 流程控制
- if判斷
- for循環
- switch分支
- goto跳轉
- 斐波那契數列
- Go語言內置容器
- 數組
- 切片
- 映射
- 函數
- 函數(上)
- 函數(中)
- 函數(下)
- 小節
- 包管理
- 結構體
- 結構體(上)
- 結構體(中)
- 結構體(下)
- 小節
- 錯誤處理
- 錯誤處理
- 宕機
- 錯誤應用
- 小節
- 文件操作
- 獲取目錄
- 創建和刪除目錄
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 處理JSON文件
- 接口與類型
- 接口的創建與實現
- 接口賦值
- 接口嵌入
- 空接口
- 類型斷言(1)
- 類型斷言(2)
- 小節
- 并發與通道
- goroutine協程
- runtime包
- 通道channel
- 單向通道channel
- select
- 線程同步
- 多線程的深入學習
- http編程
- http簡介
- Client和Request
- get請求
- post請求
- 模塊函數方法
- 模塊
- fmt庫,模塊
- 項目練習
- 爬蟲:高三網
- 爬蟲:快代理
- 爬蟲:快代理2
- 多線程:通道思路
- 多線程爬蟲:快代理