在异步 JavaScript 中,并行运行任务并等待所有任务完成使用 Promise.all
很容易:
async function bar(i) {
console.log('started', i);
await delay(1000);
console.log('finished', i);
}
async function foo() {
await Promise.all([bar(1), bar(2)]);
}
// This works too:
async function my_all(promises) {
for (let p of promises) await p;
}
async function foo() {
await my_all([bar(1), bar(2), bar(3)]);
}
我试图用 python 重写后者:
import asyncio
async def bar(i):
print('started', i)
await asyncio.sleep(1)
print('finished', i)
async def aio_all(seq):
for f in seq:
await f
async def main():
await aio_all([bar(i) for i in range(10)])
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
但它按顺序执行我的任务。
等待多个可等待对象的最简单方法是什么?为什么我的方法不起作用?
原文由 Tamas Hegedus 发布,翻译遵循 CC BY-SA 4.0 许可协议
等同于使用
asyncio.gather
:因为当你
await
中的每一项时seq
,你阻止了协程。所以本质上,你有伪装成异步的同步代码。如果您真的 _想要_,您可以使用loop.create_task
或asyncio.ensure_future
asyncio.gather
编辑
原始答案使用了较低级别的
asyncio.wait
。