python基礎 協程詳解

2022-05-14 20:03:11 字數 2208 閱讀 8482

python的yield不但可以返回乙個值,它還可以接收呼叫者發出的引數。

來看例子:

傳統的生產者-消費者模型是乙個執行緒寫訊息,乙個執行緒取訊息,通過鎖機制控制佇列和等待,但一不小心就可能死鎖。

如果改用協程,生產者生產訊息後,直接通過yield跳轉到消費者開始執行,待消費者執行完畢後,切換回生產者繼續生產,效率極高:

1

#coding:utf-8

2__author__ = '

administrator'3

4def

consumer():

5 r = '

[consumer]初始化'6

while

true:

7 n = yieldr8

print

(n)9

ifnot

n:10

return

11print('

[consumer] consuming %s...

' %n)

12 r = '

200 ok'13

14def

produce(c):

15 r=c.send(none)

16print

(r)17 n =0

18while n < 5:

19 n = n + 1

20print('

[producer] producing %s...

' %n)

21 r =c.send(n)

22print('

[producer] consumer return: %s

' %r)

23c.close()

2425 c =consumer()

26 produce(c)

輸出:

[consumer]初始化

[producer] producing 1...

1[consumer] consuming 1...

[producer] consumer

return: 200ok

[producer] producing 2...

2[consumer] consuming 2...

[producer] consumer

return: 200ok

[producer] producing 3...

3[consumer] consuming 3...

[producer] consumer

return: 200ok

[producer] producing 4...

4[consumer] consuming 4...

[producer] consumer

return: 200ok

[producer] producing 5...

5[consumer] consuming 5...

[producer] consumer

return: 200 ok

注意到consumer函式是乙個generator,把乙個consumer傳入produce後:

首先呼叫c.send(none)啟動生成器,使consumer函式先執行到yield r,將r返回值傳回;

然後,一旦生產了東西,通過c.send(n)切換到consumer執行n= 那裡開始往下執行完,再執行到yield r,將r返回值傳回;

consumer通過yield拿到訊息,處理,又通過yield把結果傳回;

produce拿到consumer處理的結果,繼續生產下一條訊息;

produce決定不生產了,通過c.close()關閉consumer,整個過程結束。

整個流程無鎖,由乙個執行緒執行,produceconsumer協作完成任務,所以稱為「協程」,而非執行緒的搶占式多工

Python基礎 協程

協程是一種使用者態的輕量級執行緒,本質上是單執行緒 協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。使用greenlet實現協程操作,greenlet需要手動進行切換 首先需要使用greenlet建立類似與堆疊空間,然...

Python基礎 34 協程

概述 協程,又稱微執行緒,也稱為使用者級執行緒,在不開闢執行緒的基礎上完成多工,也就是在單執行緒的情況下完成多工,多個任務按照一定順序交替執行,通俗理解只要在def裡面只看到乙個yield關鍵字,就表示它是協程 簡單理解 協程是實現多工的一種方式 1 無需執行緒上下文切換的開銷,協程避免了無意義的排...

Python基礎 協程(一)

究竟什麼是協程?1.涉及到同步鎖。2.涉及到執行緒阻塞狀態和可執行狀態之間的切換。3.涉及到執行緒上下文的切換。以上涉及到的任何一點,都是非常耗費效能的操作。next 函式用來建立乙個協程嗷 yield會暫停,當send 的時候才會繼續 python中使用async await來使用協程 impor...