yield可以手工實現協程,但python為我們封裝了乙個greenlet,先看看yield實現,yield需要手工操作,無法實現io操作時自動切換協程,greenlet是封裝好的,能方便使用io切換!
import
time
import
queue
def
consumer(name):
print
(
"--->starting eating baozi..."
)
while
true
:
new_baozi
=
yield
print
(
"[%s] is eating baozi %s"
%
(name,new_baozi))
#time.sleep(1)
def
producer():
r
=
con.__next__()
r
=
con2.__next__()
n
=
0
while
n <
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
如何使用請看下面例子!
from
greenlet
import
greenlet
def
test1():
print
(
12
)
gr2.switch()#手工切換
print
(
34
)
gr2.switch()#手工切換
def
test2():
print
(
56
)
gr1.switch()
print
(
78
)
gr1
=
greenlet(test1)
gr2
=
greenlet(test2)
gr1.switch() #手工切換
gevent 是乙個第三方庫,可以輕鬆通過gevent實現併發同步或非同步程式設計,在gevent中用到的主要模式是greenlet, 它是以c擴充套件模組形式接入python的輕量級協程。 greenlet全部執行在主程式作業系統程序的內部,但它們被協作式地排程。
import
gevent
def
func1():
print
(
'\033[31;1m李闖在跟海濤搞...\033[0m'
)
gevent.sleep(
2
)
print
(
'\033[31;1m李闖又回去跟繼續跟海濤搞...\033[0m'
)
def
func2():
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中的協同程式類似於多執行緒,但是與多執行緒還是有點區別的,區別在於協同程式必須必須合作,且同一時刻只有執行乙個協同程式。這是乙個簡單的示例函式,下面看看協同程式的呼叫 在上面的呼叫 中,右邊附上了列印輸出,第一行是建立乙個協同程式,第二行檢視協同程式的返回值,第三行檢視此時協同程式的狀態,處於...