import asyncio @asyncio.coroutine def aa(x): print ('1') b=yield from x print (b) @asyncio.coroutine def bb(): print ('2') yield print ('3') return 4 x=bb() loop = asyncio.get_event_loop() loop.run_until_complete(aa(x)) loop.close()
以上能揭示由asyncio模塊建立的攜程的運行過程async
用asyncio提供的@asyncio.coroutine能夠把一個generator標記爲coroutine類型oop
以上代碼,首先aa執行,打印1,執行到yield from x,打印2,暫停,而這時,已經沒有可執行的攜程了,而程序並不會永遠暫停下去,這樣就打印了3,而後返回4,aa隨即打印4spa
,整個過程只進行了一次yieldcode
因此,一個攜程既能夠是單個攜程,也能夠是一個攜程嵌套另外一還能夠是內部包含多個攜程,也能夠是一個攜程包含多個攜程,多個攜程又各自包含多個攜程。總之,無論怎麼說,loop.run_until_complete()接受的這個參數就是一個攜程。blog
關於一個攜程內部包含多個攜程的概念,請看這一個例子ci
asyncio.wait(tasks)這個方法就能夠當作返回一個內部包含多個攜程的外部攜程get
import asyncio @asyncio.coroutine def d(): print ('d') yield print ('end') @asyncio.coroutine def e(): print ('e') yield @asyncio.coroutine def f(): print ('f') yield @asyncio.coroutine def g(): print ('g') yield @asyncio.coroutine def h(): print ('h') yield @asyncio.coroutine def 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執行攜程內剩餘代碼generator