本質上,goroutine 就是協程。 不同的是,Golang 在 runtime、系統呼叫等多方面對 goroutine 調度進行了封裝和處理,當遇到長時間執行或進行系統呼叫時。 (推薦學習:go)
會主動把當前goroutine 的CPU (P) 轉讓出去,讓其他goroutine 能被調度並執行,也就是Golang 從語言層面支持了協程。
Golang 的一大特色就是從語言層面原生支援協程,在函數或方法前面加 go關鍵字就可建立一個協程。
其他方面的比較
記憶體消耗方面
每個goroutine (協程) 預設佔用記憶體遠比Java 、C 的執行緒少。
goroutine:2KB
線程:8MB
線程和goroutine 切換調度開銷方面
線程/goroutine 切換開銷方面, goroutine 遠比線程小
線程:涉及模式切換(從用戶態切換到內核狀態)、16個寄存器、PC、SP...等寄存器的刷新等。
goroutine:只有三個暫存器的值修改- PC / SP / DX.
#我們知道,協程(coroutine)是Go語言中的輕量級線程實現,由Go運行時(runtime)管理。
在一個函數呼叫前加上go關鍵字,這次呼叫就會在一個新的goroutine中並發執行。當被呼叫的函數回傳時,這個goroutine也自動結束。 要注意的是,如果這個函數有回傳值,那麼這個回傳值就會被丟棄。
先看一下下面的程式碼:
func Add(x, y int) { z := x + y fmt.Println(z) } func main() { for i:=0; i<10; i++ { go Add(i, i) } }
執行上面的程式碼,會發現螢幕什麼也沒列印出來,程式就退出了。
以上是golang 如何開啟協程的詳細內容。更多資訊請關注PHP中文網其他相關文章!