第八章 goroutine 和 channel
goroutine
func main() {
for i := 0; i < 1000; i++ {
go func(i int) {
for {
fmt.Printf("Hello from "+
"goroutine %d\n", i)
}
}(i)
}
time.Sleep(time.Minute)
}
協程Coroutine
- 輕量級“線程”
- 非搶佔式多任務處理,由協程主動交出控制權
- 編譯器 / 解釋器 / 虛擬機層面的多任務
- 多個攜程可能在一個或多個線程上運行
goroutine的定義
- 任何函數只需要加上go就能送給調度器運行
- 不需要在定義時區分是否是異步函數
- 調度器在合適的點進行切換
- 使用 -race 來檢測數據訪問衝突
goroutine可能的切換點
- I/O , select
- channel
- 等待鎖
- 函數調用(有時)
- runtime.Gosched()