gpt4 book ai didi

python - 将 concurrent.futures.Future 与 greenlets/gevent 一起使用

转载 作者:行者123 更新时间:2023-12-04 20:08:57 25 4
gpt4 key购买 nike

我有一个 python 库,它通过多播执行异步网络,这可能会获得其他服务的回复。它通过返回 Future 来隐藏肮脏的工作。这将捕获一个回复。我正在将此库集成到现有的 gevent 应用程序中。调用模式很简单:

future = service.broadcast()
# next call blocks the current thread
reply = future.result(some_timeout)

在引擎盖下, concurrent.futures.Future.result()使用 threading.Condition.wait() .

使用猴子补丁线程模块,这看起来很好,很安全,并且不会阻塞 greenlets。

在这里或混合时有什么理由担心 geventconcurrent.futures ?

最佳答案

好吧,据我所知,futures没有记录在 threading.Condition 之上工作, 和 gevent没有记录到能够修补 futures安全。因此,理论上,有人可以编写一个会破坏 gevent 的 Python 实现。 .

但在实践中呢?很难想象这样的实现会是什么样子。您显然需要某种同步对象来制作 Future工作。当然,您可以使用 Event , Lock , 和 Rlock而不是 Condition , 但这不会对 gevent 造成问题.实现可能会破坏事情的唯一方法是直接转到 pthreads/Win32/Java/.NET/whatever 同步对象,而不是使用 threading 中的包装器。 .

如果发生了,你会如何处理?好吧,futures用纯Python实现,非常简单的Python,还有一个功能齐全的backport适用于 2.5+/3.2+。所以,你只需要捕获那个反向端口并换出concurrent.futures对于 futures .

所以,如果你正在做一些古怪的事情,比如部署一个将在无人值守的情况下运行 5 年的服务器,并且它的 Python 可能会在它下面反复升级,也许我现在会安装 backport 并改用它。

否则,我只需在适当的位置记录假设(以及万一它被破坏的解决方法),然后使用 stdlib 模块。

关于python - 将 concurrent.futures.Future 与 greenlets/gevent 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104177/

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