以下代码输出如下:
1 sec delay, print "1",
1 sec delay, print "2",
1 sec delay, print "1",
1 sec delay, print "2"
如何修改才能这样运行:
1 sec delay, print "1", print "1",
1 sec delay, print "2", print "2"
我希望它运行时 for 循环的两个实例同时开始执行。当每个实例执行时,它们会同时遇到 first() 函数,然后同时遇到 second() 函数,从而按照上述顺序打印。
代码:
import asyncio
async def first():
await asyncio.sleep(1)
return "1"
async def second():
await asyncio.sleep(1)
return "2"
async def main():
for i in range(2):
result = await first()
print(result)
result2 = await second()
print(result2)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
请您参考如下方法:
查看所需的输出,目标似乎是保持单个迭代不变 - 即依次运行 first 和 second - 但执行两个循环迭代并行。
假设你只想修改main(),可以这样实现:
async def main():
async def one_iteration():
result = await first()
print(result)
result2 = await second()
print(result2)
coros = [one_iteration() for _ in range(2)]
await asyncio.gather(*coros)
上面的代码不是按顺序迭代,而是为每个迭代任务创建一个协程,并使用 asyncio.gather并行执行所有迭代。
请注意,简单地创建协程并不会开始执行它,因此大量的 coros 不会阻塞事件循环。
