python 協程

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

相關文章
相關標籤/搜索