對協程的理解

2022-04-16 18:41:03 字數 548 閱讀 7762

實現併發,可以使用多程序,多執行緒。

程序和執行緒有個共同點,他們都是通過作業系統來排程的。

而協程,則把排程的權力交給了程式設計師。

協程可以看作使用者態協作執行緒

使用者態:是說協程的排程權屬於程式設計師。

協作:是說協程的排程是協作式的,不是搶占的。在協程中,某部分可以通過呼叫某個方法,將控制權交出,這時一種協作。

執行緒:協程中的排程是在乙個執行緒中進行,所以無論怎麼排程,都共用一套位址空間。

這樣,可以由程式設計師來決定什麼時候呼叫另一部分內容。

這種呼叫和呼叫另乙個函式不同,在foo函式中直接呼叫bar函式,需要重新設定暫存器狀態,切換棧幀,本質上是執行緒切換,開銷較大。

而協程只存在於乙個執行緒之中,所以呼叫的話開銷很小。

還有乙個好處是,由於協程是在同乙個執行緒中排程,所以對公有變數操作不用加鎖。

所以協程遵照的是人的思維,實現起來較為複雜。

支援協程的語言會給程式設計師應用協程的方法,如python中的yield

對協程的理解

對於作業系統來說,協程其實是一種特殊的執行緒,對於cpu來說,協程是非搶占式 程序和執行緒是搶占式的 實現機理如下 有兩個function a,b,a呼叫b,b要執行一段時間,很晚才返回,a不會因為等b而一直占用cpu,即a是非阻塞的。b返回後,a又能繼續執行。神奇的是,a和b又是走在一條獨木橋 橋...

python 協程 理解

協程的使用依賴於gevent 它封裝了greenlet 在使用的時候 主要是切斷當前程式執行,然後當收到訊號再次執行程式。在中斷中可以進行其它任務。程式import gevent def foo print running in foo gevent.sleep 0 print explicit c...

golang 協程理解

本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...