使用带有greenlets/gevent的concurrent.futures.Future

Nin*_*ker 5 python concurrency multithreading gevent

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

future = service.broadcast()
# next call blocks the current thread
reply = future.result(some_timeout)
Run Code Online (Sandbox Code Playgroud)

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

使用猴子修补的线程模块,这看起来很好而且安全,并且没有使用greenlet阻塞.

有没有理由担心在这里或混合geventconcurrent.futures

aba*_*ert 4

嗯,据我所知,futures没有记录可以在 之上工作threading.Condition,也gevent没有记录可以futures安全地修补。因此,从理论上讲,有人可以编写一个会崩溃的 Python 实现gevent

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

如果发生的话你会如何处理?嗯,futures是用纯 Python 实现的,而且是非常简单的 Python,并且有一个功能齐全的向后移植,可以与 2.5+/3.2+ 一起使用。因此,您只需抓住该向后移植并concurrent.futures换成futures.

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

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