我有一个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。
有没有理由担心这里或混合gevent
和concurrent.futures
?
答案 0 :(得分:4)
嗯,据我所知,futures
没有记录在threading.Condition
之上工作,并且gevent
没有记录能够修补{{1}安全的。因此,在 theory 中,有人可以编写一个会破坏futures
的Python实现。
但在实践中?很难想象这样的实现会是什么样子。你显然需要某种同步对象才能使gevent
工作。当然,您可以使用Future
,Event
和Lock
代替Rlock
,但这不会导致Condition
出现问题。实现可能会破坏事物的唯一方法是直接转到pthreads / Win32 / Java / .NET /任何同步对象,而不是使用gevent
中的包装器。
如果它发生了,你会怎么处理?好吧,threading
是用纯Python实现的,而且它非常简单,而且有一个功能齐全的backport可以使用2.5 + / 3.2 +。所以,您只需抓住该backport并替换futures
concurrent.futures
。
所以,如果你正在做一些古怪的事情,比如部署一台将无人值守运行5年的服务器,可能会在其下面反复升级Python,也许我现在就安装后端并改用它。
否则,我只是在适当的位置记录假设(以及万一被破坏的解决方法),然后使用stdlib模块。