python - 如何包装自定义 future 以在 Python 中与 asyncio 一起使用?

标签 python python-3.x python-asyncio concurrent.futures

有很多库使用他们的自定义版本 Future . kafkas3transfer只是两个例子:他们所有自定义的类 future 类都有 object 作为父类(super class)。

毫不奇怪,您不能对此类对象直接调用 asyncio.wrap_future(),也不能对它们使用 await

包装此类 futures 以与 asyncio 一起使用的正确方法是什么?

最佳答案

如果 future 类支持标准的 future 特性,例如 done 回调和 result 方法,只需使用如下内容:

def wrap_future(f):
    loop = asyncio.get_event_loop()
    aio_future = loop.create_future()
    def on_done(*_):
        try:
            result = f.result()
        except Exception as e:
            loop.call_soon_threadsafe(aio_future.set_exception, e)
        else:
            loop.call_soon_threadsafe(aio_future.set_result, result)
    f.add_done_callback(on_done)
    return aio_future

将该代码视为一个模板,您可以对其进行自定义以匹配您正在处理的 future 的具体情况。

预期用途是从运行异步事件循环的线程调用它:

value = await wrap_future(some_foreign_future)

如果您从不同的线程调用它,请务必显式传递 loop,因为 asyncio.get_event_loop 从未注册到 asyncio 的线程调用时将失败。

关于python - 如何包装自定义 future 以在 Python 中与 asyncio 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49350346/

相关文章:

Python 异步队列未更新

python - 如何在越来越多的任务上使用 asyncio.wait?

python - Barebones SWIG python C 接口(interface)在 OSX+clang 上出现段错误,而不是在 Linux+gcc 中

python - 如何删除括号内的空格?

Python Click模块字典返回值

python - 适用于 Python 3.4.4 的 Jinja2 版本

python - 根据 key 的多个值之一对字典进行排序

python - Pytest 适用于旧模拟,但不适用于 unittest.mock

python - 如何在python中将指数值转换为字符串格式?

python - 在 aiohttp 中执行请求时 await 和 async-with 之间有本质区别吗?