yield實現 coroutine協程案例

2022-09-12 22:42:30 字數 3854 閱讀 7847

yield可以手工實現協程,但python為我們封裝了乙個greenlet,先看看yield實現,yield需要手工操作,無法實現io操作時自動切換協程,greenlet是封裝好的,能方便使用io切換!

importtime

importqueue

defconsumer(name):

print("--->starting eating baozi...")

whiletrue:

new_baozi=yield

print("[%s] is eating baozi %s"%(name,new_baozi))

#time.sleep(1)

defproducer():

r=con.__next__()

r=con2.__next__()

n=0

whilen <5:

n+=1

con.send(n)

con2.send(n)

print("\033[32;1m[producer]\033[0m is ****** baozi %s"%n )

if__name__=='__main__':

con=consumer("c1")

con2=consumer("c2")

p=producer()

方法二  

greenlet實現方法:

greenlet是乙個用c實現的協程模組,相比與python自帶的yield,它可以使你在任意函式之間隨意切換,而不需把這個函式先宣告為generator

安裝方法:

pip install greenle

如何使用請看下面例子!

fromgreenletimportgreenlet

deftest1():

print(12)

gr2.switch()#手工切換

print(34)

gr2.switch()#手工切換

deftest2():

print(56)

gr1.switch()

print(78)

gr1=greenlet(test1)

gr2=greenlet(test2)

gr1.switch()   #手工切換

gevent 是乙個第三方庫,可以輕鬆通過gevent實現併發同步或非同步程式設計,在gevent中用到的主要模式是greenlet, 它是以c擴充套件模組形式接入python的輕量級協程。 greenlet全部執行在主程式作業系統程序的內部,但它們被協作式地排程。

importgevent

deffunc1():

print('\033[31;1m李闖在跟海濤搞...\033[0m')

gevent.sleep(2)

print('\033[31;1m李闖又回去跟繼續跟海濤搞...\033[0m')

deffunc2():

print('\033[32;1m李闖切換到了跟海龍搞...\033[0m')

gevent.sleep(1)

print('\033[32;1m李闖搞完了海濤,回來繼續跟海龍搞...\033[0m')

gevent.joinall([

gevent.spawn(func1),

gevent.spawn(func2),

#gevent.spawn(func3),

])

yield實現多工演示

import time deftask1 任務1函式 i 0while true print in task1 time.sleep 1 主程式中通過next 拿到yield後面的值 生成器物件.send 傳送的資料 這時傳送的資料傳遞到yield,當做yield的返回值 result yield ...

yield實現狀態儲存

import time deffunc print 123 sum 0 print 6666 yield sum print 7777 yield sum print 8888 yield sumdef fff g func print 這是在ffff函式中 print next g time.sl...

Lua學習筆記四 協同程式coroutine

lua中的協同程式類似於多執行緒,但是與多執行緒還是有點區別的,區別在於協同程式必須必須合作,且同一時刻只有執行乙個協同程式。這是乙個簡單的示例函式,下面看看協同程式的呼叫 在上面的呼叫 中,右邊附上了列印輸出,第一行是建立乙個協同程式,第二行檢視協同程式的返回值,第三行檢視此時協同程式的狀態,處於...