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