异步为python 3.6同时启动作业

时间:2018-04-03 03:55:29

标签: python aiohttp

我有几个http请求同时触发。我正在尝试使用async for来执行此操作。

import asyncio

async def ticker(delay, to):
    for i in range(to):
        yield i
        print(i)
        await asyncio.sleep(delay) # instead of aiohttp request
        print(i, ' fin')

async def main():
    async for x in ticker(1,2):
        pass

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

我继续使用以下内容进行后续调用:

0
0 fin
1
1 fin

相反,我需要输出如下所示:

0
1
0 fin
1 fin

你能告诉我如何做到这一点吗?

1 个答案:

答案 0 :(得分:3)

问题在于async for正是您不需要的。

async for旨在在每次迭代之间等待任务完成时进行迭代;你想迭代(开始请求)没有等待前面的任务完成。

你想要像

这样的东西
async def do_request():
    await asyncio.sleep(1)

async def main():
    await asyncio.gather(*[
        do_request() for i in range(10)
    ])

如果没有回答你的问题,请跟进后续评论。