在使用asyncio.wait_for()函数时,需要注意它只等待包装后的协程完成,而asyncio.shield()函数返回的是被保护的协程对象,因此在使用wait_for()函数时,需要将其包装一层,例如使用asyncio.gather()或asyncio.wait()函数来包装asyncio.shield()函数返回的协程对象,示例如下:
import asyncio
async def my_task():
await asyncio.sleep(10)
async def main():
task = asyncio.shield(my_task())
# 使用asyncio.gather()函数来包装协程对象
# result = await asyncio.wait_for(asyncio.gather(task), timeout=6) # 抛出TimeoutError
# 使用asyncio.wait()函数来包装协程对象
result = await asyncio.wait(asyncio.shield(task), timeout=6)
print(result)
asyncio.run(main())
上一篇:asyncio.wait_for 中的 asyncio.TimeoutError 是由于 async_generator 耗尽或消耗的原因产生的。
下一篇:asyncio.wait_for不会传播CancelledError,如果在取消之前等待的future已经“完成”。