async for in python 3.6 同时启动作业

async for in python 3.6 to start jobs simultaneously

我有几个要同时触发的 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

你能告诉我怎么做吗?

问题是 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)
    ])

如果不能回答您的问题,请评论 follow-up。