標籤:注意 eve com pytho 中斷 建立 ret get 電腦
import asyncio@asyncio.coroutinedef aa(x): print (‘1‘) b=yield from x print (b)@asyncio.coroutinedef bb(): print (‘2‘) yield print (‘3‘) return 4 x=bb()loop = asyncio.get_event_loop()loop.run_until_complete(aa(x))loop.close()
以上能揭示由asyncio模組建立的攜程的運行過程
用asyncio提供的@asyncio.coroutine可以把一個generator標記為coroutine類型,然後在coroutine內部用yield from調用另一個coroutine實現非同步作業
以上代碼,攜程aa和攜程bb共同組成一個攜程池,首先aa執行,列印1,執行到yield的時候產生中斷,電腦轉而隨機執行攜程池內其他的攜程,因為這裡只有兩個攜程,所以就執行bb,列印2,產生中斷,而這時,攜程池內全部的攜程都產生中斷,已經沒有可執行檔攜程了,那麼電腦並不會永遠中斷下去,而是逐個跨過各個攜程的yield去執行完攜程內剩餘的代碼。又因為,aa的再次執行需要等待bb執行完畢的返回(yield from x),那麼bb永遠是先於aa執行完畢的。這樣就列印了3,然後返回給攜程aa一個4,aa隨即列印4
關於攜程池的概念,請看這一個例子
import asyncio@asyncio.coroutinedef d(): print (‘d‘) yield print (‘end‘)@asyncio.coroutinedef e(): print (‘e‘) yield @asyncio.coroutinedef f(): print (‘f‘) yield @asyncio.coroutinedef g(): print (‘g‘) yield @asyncio.coroutinedef h(): print (‘h‘) yield @asyncio.coroutinedef j(): print (‘j‘) yield loop = asyncio.get_event_loop()tasks = [d(),e(),f(),g(),h(),j()]loop.run_until_complete(asyncio.wait(tasks))loop.close()
‘‘‘
f
d
j
h
g
e
end
‘‘‘
注意end永遠是最後列印的,這更加說明了,只有在攜程池內所有攜程全部都處於中斷的時候,電腦就會跨過攜程內的yield執行攜程內剩餘代碼
python 協程