相关疑难解决方法(0)

使用 asyncio 处理超时

免责声明:这是我第一次尝试该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)

python python-asyncio

6
推荐指数
1
解决办法
6342
查看次数

标签 统计

python ×1

python-asyncio ×1