def gen():
for i in range(10):
yield i
# 初始化生成七函式 返回生成器物件
,簡稱生成器
mygen = gen()
for i in mygen:
print(i)
# (1) 用協程改寫成生產者消費者
def producer():
for i in range(100):
yield i
def consumer():
g = producer()
for i in g:
print(i)
# (2) 協程的具體實現
from greenlet import greenlet
import time
switch 利用它進行任務的切塊
,一般在阻塞的時候切塊
只能預設手動切換
缺陷: 不能規避
io,不能自動實現遇到阻塞就切換
def eat():
print("eat one")
# 手動切換
play
這個協程中
g2.switch()
time.sleep(1)
print("eat two")
def play():
print("play one")
time.sleep(1)
print("play two")
g1.switch()
g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch()
eat one
play one
play two
eat two
# (3) 缺陷
:gevent
不能夠識別
time.sleep
是阻塞import gevent
# gevent 其中有乙個
spawn
類似於switch ,
也是切換任務的
import time
def eat():
print("eat one")
time.sleep(1)
print("eat two")
def play():
print("play one")
time.sleep(1)
print("play two")
# 利用
gevent
建立協程物件
g1g1 = gevent.spawn(eat)
#利用gevent
建立協程物件
g2g2 = gevent.spawn(play)
# 協程的阻塞是
join
等待當前協程執行完畢之後
,再向下執行
g1.join() #阻塞直到
g1協程執行完畢
g2.join() #阻塞直到
g2協程執行完畢
print("主線程執行完畢
")# (4) 高階 用
gevent.sleep
來取代time.sleep()
import gevent
def eat():
print("eat one")
gevent.sleep(1)
print("eat two")
def play():
print("play one")
gevent.sleep(1)
print("play two")
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
print("主線程執行完畢
")# (5) 終極解決識別問題
# spawn gevent 中
spawn
遇到阻塞會自動切換協程任務
from gevent import monkey
# 把patch_all
下面引入的所有模組中的阻塞識別出來
monkey.patch_all()
import time
import gevent
def eat():
print("eat one")
time.sleep(1)
print("eat two")
def play():
print("play one")
time.sleep(1)
print("play two")
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
print("主程序執行結束
...")
二.協程例子
併發程式設計之協程
協程 是單執行緒下的併發,一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。對比作業系統控制線程的切換,使用者在單執行緒內控制協程的切換 優點 1.協程的切換開銷更小,屬於程式級別的切換,作業系統完全感知不到,因而更加輕量級 2.單執行緒內就可以實現併發的...
併發程式設計之 協程
程序 資源單位 執行緒 執行單位 協程 單執行緒下實現併發 併發 切換 儲存狀態 程式設計師自己通過 自己檢測程式中的io 一旦遇到了io自己通過 切換 給作業系統的感覺就是你這個執行緒沒有任何的io 從而提公升 的執行效率 切換 儲存狀態一定能夠提公升效率嗎?1.當任務是io密集型的情況下 提公升...
python 併發程式設計 協程 協程介紹
協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的 需要強調的是 1.python的執行緒屬於核心級別的,即由作業系統控制排程 如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可...