多个异步调用阻塞

2024-01-20

My code:

import asyncio

async def test(i):
    await asyncio.sleep(i)
    print('test')

async def main():
    await test(2)
    await test(2)
    await test(2)

asyncio.get_event_loop().run_forever(main())

我期待它休眠三秒钟,然后打印出来'test'三次,但每次之前都会等待 2 秒'test'分别(所以最后'test'6 秒后打印)。

我理解错了什么,如何修复它以按我的预期工作?


await暂停当前​​函数的执行,直到 future 返回。在test,这使得该函数等待 2 秒,直到asyncio.sleep已返回,打印前。在main,它使函数等待,直到test已返回(之后返回)print之后它会做什么sleep已返回),然后继续下一行await test.

如果你想执行全部test同时并让它们在两秒后立即打印,您可以使用asyncio.gather:

async def main():
    await asyncio.gather(test(2), test(2), test(2))

本次安排三test同时事件循环上的协程并等待所有组合结果,这些结果将在约 2 秒内到达。

您还可以触发并忘记协程,而无需等待其完成:

def main():
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))
    asyncio.ensure_future(test(2))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个异步调用阻塞 的相关文章

随机推荐