Python asyncio await-for timeout 不适用于无限任务



在Python 3.8中,我想我理解为什么下面的forever函数不会在1秒后超时,除非我包含asyncio.sleep(1)。这是因为它在离开队列后开始执行,而队列上没有其他任务运行,因为它从不阻塞?

我需要完成的是调用用户提供的一些函数(比如forever(。他们可能会给我一个永远不会返回的函数(例如,它无限循环,不阻塞(。那么,我如何获得调用用户函数并允许它运行到超时的效果呢?

import asyncio
async def long_time():
# Sleep for one hour
await asyncio.sleep(3600) 
print('yay!')
async def forever():
while True:
pass
#await asyncio.sleep(1)
async def main():
# Wait for at most 1 second
try:
await asyncio.wait_for(long_time(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout 1!')
try:
await asyncio.wait_for(forever(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout 2!')
asyncio.run(main())

Async/await使用单个线程在异步任务(事件循环,队列(之间切换。

您的任务没有超时,因为forever以同步方式无限执行,不允许任何其他异步任务(或同一线程中的任何其他代码(接管,从而完全阻塞了线程。如果您预计用户提供的某些函数将包含非常长的同步计算,那么您应该使用单独的进程来运行这样的函数。

理论上,您可以使用单独的线程而不是进程,但由于GIL的原因,不能在CPython中使用。使用GIL一次只能有一个线程执行代码。

相关内容

  • 没有找到相关文章

最新更新