Go協程(Goroutine)是與其餘函數同時運行的函數。能夠認爲Go協程是輕量級的線程。與建立線程相比,建立Go協程的成本很小。所以在Go中同時運行上千個協程是很常見的。編程
Go語言原生就支持了高併發操做,這一優秀基因在目前主流的編程語言中是比較少見的,Go語言的高併發性主要是經過 Go協程(Goroutine)來實現的。併發
協程的特色async
Go語言實現協程,只須要在函數前添加 go 關鍵字,就可使此函數併發執行編程語言
示例代碼以下:函數
package main import ( "fmt" "time" ) 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.Millisecond) }
C++ 能夠經過 Boost.Coroutine 庫實現協程。高併發
Java 不支持協程spa
Python 3.5 加入了 async def 對協程的支持,可是Python的 協程是在方法定義時就肯定了,被定義協程的方法不能當作普通方法來使用,而Go語言中定義方法和協程調用是分開的,任意方法加上go 關鍵字均可以進行協程併發操做,實現瞭解耦合。線程
Go語言中全部的協程都經過調度器進行調度,大併發下成百上千甚至幾千的協程調用 經過調度器安排到不一樣的線程中執行。code
調度的切換協程
調度器會在什麼時候的時間點進行協程之間的切換,經過切換能夠將計算資源分配給其餘協程而不至於被一個協程鎖死資源,主要的切換點以下: