golang中協程是goroutine,不同的是,Golang在runtime、系統呼叫等多方面對goroutine調度進行了封裝和處理,當遇到長時間執行或進行系統呼叫時,會主動把目前goroutine的CPU轉讓出去,讓其他goroutine能被調度並執行,Golang從語言層面原生支援協程,在函數或方法前面加go關鍵字就可建立一個協程。
本教學操作環境:windows10系統、go1.20.1版本、Dell G3電腦。
對於協程(用戶級線程),這是對內核透明的,也就是係統並不知道有協程的存在,完全由驢自己的程式進行調度的,因為是由用戶程式自己控制,那麼就很難像搶佔式調度那樣做到強制的CPU控制權切換到其他進程/線程,通常只能進行協作式調度,需要協程自己主動把控制權轉讓出去之後,其他協程才能被執行到。
go-routine和協程區別
本質上, goroutine 就是協程。不同的是,Golang 在runtime、系統呼叫等多方面對goroutine調度進行了封裝和處理,當遇到長時間執行或進行系統呼叫時,會主動把當前goroutine的CPU (P)轉讓出去,讓其他goroutine能被調度並執行,也就是Golang從語言層面支持了協程。 Golang 的一大特色就是從語言層面原生支援協程,在函數或方法前面加go關鍵字就可建立一個協程。
其他方面的比較
1、記憶體消耗方面
每個go-routine (協程)預設佔用記憶體遠比Java、C的執行緒少。
go-routine. 2KB。
線程: 8MB。
2、執行緒與go-routine切換調度開銷方面
執行緒/go-routine切換開銷方面,go-routine 遠比執行緒小。
執行緒:涉及模式切換(從使用者狀態切換到核心狀態)、16個暫存器、PC、 SP.. 等暫存器的刷新等。
go-routine:只有三個暫存器的值修改- PC/SP /DX。
二、協程底層實作原理
執行緒是作業系統的核心對象,當多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些cpu時間是一個額外的耗費。所以在一些高並發的網頁伺服器程式設計,使用一個執行緒服務-個socket連線是很不明智的。於是作業系統提供了一個基於事件模式的非同步程式設計模型。用少量的線程來服務大量的網路連接和/0操作。但是採用非同步和基於事件的程式設計模型,複雜化了程式碼的編寫,非常容易出錯。因為線程穿插,也提高排查錯誤的難度。
協程,是在應用層模擬的線程,他避免了上下文切換的額外耗費,兼顧了多線程的優點。簡化了高並發程序的複雜度。舉個例子,一個高並發的網頁伺服器,每一個socket連接進來, 伺服器用一個協程來對他進行服務。代碼非常清晰。而且兼顧了性能。
以上是golang中協程是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!