根据asyncio
制作了asynciox
,并提供sleep方法,尽量不修改源代码的结构,asynciox
支持本地运行和调试
如果有对协程基础不理解的, 请参看 协程系列汇总
python main.py
from asynciox.base_eventx import BaseEventLoop
from asynciox.taskx import gather, sleep
async def req1(loop):
await sleep(1, loop=loop)
return 1
async def req2():
return 2
async def main(loop):
res = await gather(req1(loop), req2(), loop=loop)
print(res)
if __name__ == '__main__':
loop = BaseEventLoop()
BaseEventLoop().run_until_complete(main(loop))
执行顺序:
1.初始:loop.run_until_complete(main(loop))
1.1.ensure_future: 把main协程放到_ready队列,
1.2.run_forever: 本文中把这个方法称作循环器, 会调用main协程的send方法
2.收集: async def main(loop)
2.1 await gather(req1(loop), req2(), loop=loop): gather方法会创建一个新的对象_GatheringFuture,并将gather参数中的所有协程都放到_ready队列(此列中是req1和req2协程), 然后,暂停在_GatheringFuture对象的__iter__方法
3.暂停: 循环器分别调用req1和req2协程的send方法, 最终解除_GatheringFuture对象的__iter__方法中的暂停
4.回调: req2调用回调, 最后一个协程req1调用回调, 触发_GatheringFuture的回调
5.解除暂停: _GatheringFuture对象的__iter__方法