Python之路之協程初認識

2022-08-02 15:24:13 字數 1766 閱讀 8149

協程,又稱微執行緒。與子程式類似,但是又不同於子程式。可以說子程式是協程的乙個特例。

協程在執行過程中,可以在子程式某處中斷,轉而去執行其它子程式,然後在某個時間,再被呼叫,回到中斷處繼續執行。

舉個栗子:

傳統的生產者-消費者模式,一般需要乙個執行緒來寫訊息,另乙個執行緒來獲取訊息,再通過鎖機制來控制佇列和等待,但是不小心的話,就很容易產生死鎖。

但是,此時如果使用協程的話,就很容易處理了。生產者生產訊息,然後通過yeild語句來中斷處理,跳轉到消費者去執行,消費者完成操作後,再呼叫生產者繼續生產,效率極高。

先看**示例:

def

consumer():

r = ''

while

true:

n = yield

r

ifnot

n:

return

print('

消費者在消費 %s...

' %n)

r = '

success

'def

produce(c):

c.send(none)

n =0

while n < 5:

n = n + 1

print('

生產者在生產 %s...

' %n)

r =c.send(n)

print('

消費者返回狀態: %s

' %r)

c.close()

c =consumer()

produce(c)

執行結果:

生產者在生產 1...

消費者在消費 1...

消費者返回狀態: success

生產者在生產 2...

消費者在消費 2...

消費者返回狀態: success

生產者在生產 3...

消費者在消費 3...

消費者返回狀態: success

生產者在生產 4...

消費者在消費 4...

消費者返回狀態: success

生產者在生產 5...

消費者在消費 5...

消費者返回狀態: success

解析:1.send()是生成器generator的乙個方法,也就是說consumer是乙個generator,在把乙個consumer傳入produce之後;

2.c.send(none)呼叫生成器,進入consumer;

3.在consumer中,執行到yeild語句後,會跳出生成器consumer,重新進入produce;

4.在produce中,從n = 0語句繼續執行;

5.當執行到c.send(n)後(第一次進入,n = 1,迴圈後累加),再次進入consumer;

6.此時回到consumer,從之前中斷的yeild語句後繼續執行,consumer得到生產者傳回的1後賦值給n,繼續向下執行,然後到下一次迴圈的yeild語句後中斷,再次跳回produce;

7.produce會在r = c.send(n)拿到consumer返回的狀態,即r = 'success',然後繼續執行;

8.然後produce進入下乙個迴圈,則重複上面的5~7操作;

9.最後produce不生產了,則通過c.close()關閉consumer,程式結束。

補充:yeild語句特點:程式執行過程中,遇到yeild語句,會自動中斷,在下次呼叫該方法後,從上次中斷的yeild語句處繼續向下執行

python協程 asyncio 的認識

import time import asyncio async defcountdown number,n while n 0 print t minus n,format number await asyncio.sleep 1 n 1 方式一 start time.time loop asyn...

協程的認識

協程相比執行緒切換操作不耗費資源,執行緒的切換需要儲存和恢復上下文,並且每個執行緒都有自己的cache快取,比較好效能 執行緒切換導致 碎片化,每次都要判斷是否要切換,協程只需要把所有的操作弄到一起,有乙個耗時操作就切換到下乙個操作繼續執行 執行緒的問題在於他不會主動觸發排程器,尤其是cpu密集型的...

協程通訊之認識channel 阻塞

這是go裡面的核心資料型別,有了它我們可以方便的進行協程間資料通訊。其原理 於csp模型理論,go實現了部分理論。簡單說,csp模型由併發執行的實體 如程序或執行緒 組成,實體之間通過發訊息進行通訊,其中channel承擔了實體和實體之間傳送訊息的通道。在go裡面goroutine就是實體,它裡面也...