<p>是的,这是正确的。在结果准备好之前,协同程序不会继续。您可以使用<a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.gather" rel="nofollow noreferrer">asyncio.gather</a>并发运行任务:</p>
<pre><code>import asyncio
async def task(msg):
print(f"START {msg}")
await asyncio.sleep(1)
print(f"END {msg}")
return msg
async def main():
await task("1")
await task("2")
results = await asyncio.gather(task("3"), task("4"))
print(results)
if __name__ == "__main__":
asyncio.run(main())
</code></pre>
<p><strong>测试:</strong></p>
<pre><code>$ python test.py
START 1
END 1
START 2
END 2
START 3
START 4
END 3
END 4
['3', '4']
</code></pre>
<p>或者,您可以使用<a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.as_completed" rel="nofollow noreferrer">asyncio.as_completed</a>获得最早的下一个结果:</p>
<pre><code>for coro in asyncio.as_completed((task("5"), task("6"))):
earliest_result = await coro
print(earliest_result)
</code></pre>
<p><strong>更新星期五4月2日09:25:33 UTC 2021:</strong></p>
<p><a href="https://docs.python.org/3/library/asyncio-task.html#asyncio.run" rel="nofollow noreferrer">asyncio.run</a>从<strong>Python 3.7+</strong>开始可用,在以前的版本中,您必须手动创建并启动循环:</p>
<pre><code>if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
</code></pre>