可以将current.futures.Future转换为asyncio.Future吗?

Aar*_*_ab 6 python-multithreading python-3.x python-asyncio concurrent.futures

asyncio多年编写多线程代码后,我正在练习。

注意到我觉得很奇怪的东西。无论是在asyncioconcurrent有一个Future对象。

from asyncio import Future
from concurrent.futures import Future
Run Code Online (Sandbox Code Playgroud)

猜猜每个人都有自己的角色。

我的问题是我是否可以转移concurrent.future.Futureasyncio.Future(或相反)?

use*_*342 15

我的问题是我是否可以转移concurrent.future.Futureasyncio.Future(或相反)?

如果“转移”是指将一个转换为另一个,是的,这是可能的,尽管桥接阻抗不匹配可能需要一些工作。

要将 aconcurrent.futures.Future转换为asyncio.Future,您可以调用asyncio.wrap_future. 返回的 asyncio future 在 asyncio 事件循环中是可等待的,并且会在底层线程 future 完成时完成。这是有效run_in_executor实施方式

没有将 asyncio future 直接转换为 future 的公共功能concurrent.futures,但有一个asyncio.run_coroutine_threadsafe函数,它接受一个coroutine,将它提交给一个事件循环,并返回一个并发 future,当 asyncio future 完成时,它会完成。这可用于有效地将任何 asyncio-awaitable 未来转换为并发未来,如下所示:

def to_concurrent(fut, loop):
    async def wait():
        await fut
    return asyncio.run_coroutine_threadsafe(wait(), loop)
Run Code Online (Sandbox Code Playgroud)

返回的未来将表现得像您对并发未来所期望的那样,例如它的result()方法将阻塞等。您可能需要注意的一件事是回调添加到并发未来并add_done_callback在标记未来完成的线程中运行,在这种情况下是事件循环线程。这意味着如果你添加一些 done 回调,你需要小心不要在它们的实现中调用阻塞调用,以免阻塞事件循环。

请注意,调用run_coroutine_threadsafe需要事件循环在其他线程中实际运行。(例如,您可以启动一个后台线程并让它执行loop.run_forever。)