Python高階之關於協程的那些事

2021-08-31 09:37:33 字數 1766 閱讀 6710

目錄

什麼是協程。

python中對協程的實現

協程:又稱微執行緒,纖程。英文名coroutine。首先我們得知道協程是啥?協程其實可以認為是比執行緒更小的執行單元。 為啥說他是乙個執行單元,因為他自帶cpu上下文。這樣只要在合適的時機, 我們可以把乙個協程 切換到另乙個協程。 只要這個過程中儲存或恢復 cpu上下文那麼程式還是可以執行的。一句話說明什麼是執行緒:協程是一種使用者態的輕量級執行緒。(其實說完之後,我自己也很然,太官方了)

協程通俗解釋:執行緒是系統級別的,它們是由作業系統排程;協程是程式級別的,由程式設計師根據需要自己排程。我們把乙個執行緒中的乙個個函式叫做子程式,那麼子程式在執行過程中可以中斷去執行別的子程式;別的子程式也可以中斷回來繼續執行之前的子程式,這就是協程。也就是說同一執行緒下的一段**【a】執行著執行著就可以中斷,然後跳去執行另一段**【b】,當再次回來執行**塊【a】的時候,接著從之前中斷的地方開始執行。  

協程專業解釋:協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此:協程能保留上一次呼叫時的狀態(即所有區域性狀態的乙個特定組合),每次過程重入時,就相當於進入上一次呼叫的狀態,換種說法:進入上一次離開時所處邏輯流的位置。

補充:無需執行緒上下文切換的開銷,協程避免了無意義的排程,由此可以提高效能(但也因此,程式設計師必須自己承擔排程的責任,同時,協程也失去了標準執行緒使用多cpu的能力)也就是說,協程無法利用多核資源,協程的本質是個單執行緒,它不能同時將 單個cpu 的多個核用上,協程需要和程序配合才能執行在多cpu上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。

利用yield實現協程

# encoding=utf-8

__author__ = 'jonny'

__location__ = '北京'

__date__ = '2018/11/9 15:57'

#消費者

def consumer(name):

print("要開始分蘋果...")

while true:

print("\033[32;1m[consumer] %s\033[0m " % name)

#生產者

def producer(obj1, obj2):

obj1.send(none) # 啟動obj1這個生成器,第一次必須用none <==> obj1.__next__()

obj2.send(none) # 啟動obj2這個生成器,第一次必須用none <==> obj2.__next__()

n = 0

while n < 3:

n += 1

print("\033[35;1m[producer]\033[0m 正在新增蘋果 %s" % n)

obj1.send(n)

obj2.send(n)

if __name__ == '__main__':

con1 = consumer("消費者a")

con2 = consumer("消費者b")

producer(con1, con2)

執行結果:

未完待續。。。。。。。。。

Python 高階 之 協程

協程的概念級描述 與執行緒對比 知乎 鏈結 執行緒有兩個必須要處理的問題 一是碰著阻塞式i o會導致整個程序被掛起 二是由於缺乏時鐘阻塞,程序需要自己擁有排程執行緒的能力。如果一種實現使得每個執行緒需要自己通過呼叫某個方法,主動交出控制權。那麼我們就稱這種執行緒是協作式的,即是協程。在python中...

Python高階之協程詳解

目錄 協程 co routine,又稱微執行緒 是一種多方協同的工作方式。當前執行者在某個時刻主動讓出 yield 控制流,並記住自身當前的狀態,以便在控制流返回時能從上次讓出的位置恢復 resume 執行。簡而言之,協程的核心思想就在於執行者對控制流的 主動讓出 和 恢復 相對於,執行緒此類的 搶...

python高階 協程

def demo1 for i in range 3 print 正在執行demo1 format i yield defdemo2 for i in range 3 print 正在執行demo2 format i yield g1 demo1 g2 demo2 print g1 while tr...