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

时间:2014-01-14 00:43:58

标签: python multithreading concurrency gevent

我有一个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

1 个答案:

答案 0 :(得分:4)

嗯,据我所知,futures没有记录在threading.Condition之上工作,并且gevent没有记录能够修补{{1}安全的。因此,在 theory 中,有人可以编写一个会破坏futures的Python实现。

但在实践中?很难想象这样的实现会是什么样子。你显然需要某种同步对象才能使gevent工作。当然,您可以使用FutureEventLock代替Rlock,但这不会导致Condition出现问题。实现可能会破坏事物的唯一方法是直接转到pthreads / Win32 / Java / .NET /任何同步对象,而不是使用gevent中的包装器。

如果它发生了,你会怎么处理?好吧,threading是用纯Python实现的,而且它非常简单,而且有一个功能齐全的backport可以使用2.5 + / 3.2 +。所以,您只需抓住该backport并替换futures concurrent.futures

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

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