免责声明:这是我第一次尝试该asyncio
模块。
我使用asyncio.wait
以下方式来尝试支持超时功能,等待一组异步任务的所有结果。这是一个更大的库的一部分,因此我省略了一些不相关的代码。
请注意,该库已经支持提交任务以及使用 ThreadPoolExecutors 和 ProcessPoolExecutors 使用超时,因此我对使用这些选项的建议或关于为什么我使用asyncio
. 上代码...
import asyncio
from contextlib import suppress
...
class AsyncIOSubmit(Node):
def get_results(self, futures, timeout=None):
loop = asyncio.get_event_loop()
finished, unfinished = loop.run_until_complete(
asyncio.wait(futures, timeout=timeout)
)
if timeout and unfinished:
# Code options in question would go here...see below.
raise asyncio.TimeoutError
Run Code Online (Sandbox Code Playgroud)
起初我并不担心在超时时取消挂起的任务,但后来我收到了Task was destroyed but it is pending!
程序退出或loop.close
. 经过一番研究后,我发现了多种取消任务并等待它们实际被取消的方法:
选项1:
[task.cancel() for task in unfinished]
for task in unfinished:
with suppress(asyncio.CancelledError):
loop.run_until_complete(task)
Run Code Online (Sandbox Code Playgroud)
选项2:
[task.cancel() for …
Run Code Online (Sandbox Code Playgroud)