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模块创建的携程的运行过程

 

用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型

以上代码,首先aa执行,打印1,执行到yield from x,打印2,暂停,而这时,已经没有可执行的携程了,而程序并不会永远暂停下去,这样就打印了3,然后返回4,aa随即打印4

 ,整个过程只进行了一次yield

 

所以,一个携程既可以是单个携程,也可以是一个携程嵌套另一还可以是内部包含多个携程,也可以是一个携程包含多个携程,多个携程又各自包含多个携程。总之,不管怎么说,loop.run_until_complete()接受的这个参数就是一个携程。

关于一个携程内部包含多个携程的概念,请看这一个例子

asyncio.wait(tasks)这个方法就可以看成返回一个内部包含多个携程的外部携程

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执行携程内剩余代码

posted @ 2018-07-12 23:12  扫驴  阅读(181)  评论(0编辑  收藏  举报