我有一个python库,它通过多播执行异步网络,可以从其他服务获得回复。它通过返回一个捕获答复的Future来隐藏脏工作。我正在将这个库集成到现有的gevent应用程序中。调用模式非常简单,如:
future = service.broadcast()
# next call blocks the current thread
reply = future.result(some_timeout)在引擎盖下,concurrent.futures.Future.result()使用threading.Condition.wait()。
有了一个猴子补丁的线程模块,这似乎很好,安全,和非阻塞的小绿。
在这里有什么理由担心吗?或者当gevent和concurrent.futures混在一起的时候
发布于 2014-01-14 01:49:54
据我所知,futures并没有在threading.Condition之上工作,而gevent也没有被证明能够安全地修补futures。因此,理论上,有人可以编写一个可以破坏gevent的Python实现。
但在实践中?很难想象这样的实现会是什么样子。显然,您需要某种同步对象才能使Future工作。当然,您可以使用Event、Lock和Rlock而不是Condition,但这不会给gevent带来问题。唯一可行的方法是,实现可以完全打破某些东西,那就是直接转到p线程/ way 32/Java/.NET/任何同步对象,而不是使用threading中的包装器。
如果发生了这件事你会怎么处理?futures是用纯Python实现的,它非常简单,并且有一个功能齐全的后港,它适用于2.5+/3.2+。因此,您只需抢占这个后台端口并将concurrent.futures替换为futures即可。
所以,如果您正在做一些奇怪的事情,比如部署一台服务器,该服务器将在无人值守的情况下运行5年,并且它的Python可能会在下面反复升级,也许我现在就安装后端,然后使用它。
否则,我只需在适当的位置记录假设(以及解决办法,以防被破坏),然后只需使用stdlib模块。
https://stackoverflow.com/questions/21104177
复制相似问题