gpt4 book ai didi

python-3.x - concurrent.futures.Future 可以转换为 asyncio.Future 吗?

转载 作者:行者123 更新时间:2023-12-04 14:53:56 31 4
gpt4 key购买 nike

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

注意到一些我觉得很奇怪的东西。都在 asyncioconcurrent有一个Future目的。

from asyncio import Future
from concurrent.futures import Future

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

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

最佳答案

My question is if i can transfer concurrent.future.Future to asyncio.Future (or the opposite)?


如果通过“转移”是指将一个转换为另一个,是的,这是可能的,尽管桥接阻抗不匹配可能需要一些工作。
转换 concurrent.futures.Future 进入 asyncio.Future ,您可以调用 asyncio.wrap_future .返回的 asyncio future 在 asyncio 事件循环中是可等待的,并且将在底层线程 future 完成时完成。这实际上是 run_in_executor implemented .
没有将 asyncio future 直接转换为 concurrent.futures 的公共(public)功能。 future ,但有 asyncio.run_coroutine_threadsafe 函数,它接受一个协程,将它提交给一个事件循环,并返回一个并发的 future ,它在异步 future 完成时完成。这可用于有效地将任何 asyncio-awaitable future 转换为并发 future ,如下所示:
def to_concurrent(fut, loop):
async def wait():
await fut
return asyncio.run_coroutine_threadsafe(wait(), loop)
返回的 future 会表现得像你对并发 future 的期望,例如它的 result() 方法将阻塞,等等。您可能需要注意的一件事是回调添加到并发 future 与 add_done_callback 在标记 future 完成的线程中运行,在这种情况下是事件循环线程。这意味着如果您添加一些完成的回调,您需要注意不要在其实现中调用阻塞调用,以免阻塞事件循环。
请注意,调用 run_coroutine_threadsafe需要事件循环在其他线程中实际运行。 (例如,您可以启动一个后台线程并让它执行 loop.run_forever 。)

关于python-3.x - concurrent.futures.Future 可以转换为 asyncio.Future 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54096301/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com