python 协程
Posted 扫驴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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类型,然后在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.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执行携程内剩余代码
以上是关于python 协程的主要内容,如果未能解决你的问题,请参考以下文章