我有一个python库,通过多播执行异步网络,可以获得其他服务的回复.它通过返回一个捕获回复的Future来隐藏脏工作.我正在将这个库集成到现有的gevent应用程序中.呼叫模式非常简单:
future = service.broadcast()
# next call blocks the current thread
reply = future.result(some_timeout)
在引擎盖下,concurrent.futures.Future.result()使用threading.Condition.wait().
使用猴子修补的线程模块,这看起来很好而且安全,并且没有使用greenlet阻塞.
有没有理由担心这里或混合gevent和concurrent.futures?
最佳答案
好吧,据我所知,期货没有记录在threading.Gedition之上工作,并且没有记录gevent能够安全地修补期货.所以,从理论上讲,有人可以编写一个可以打破gevent的Python实现.
原文链接:https://www.f2er.com/python/439705.html但在实践中?很难想象这样的实现会是什么样子.你显然需要某种同步对象来使Future工作.当然,您可以使用Event,Lock和Rlock而不是Condition,但这不会导致gevent出现问题.实现可能会破坏事物的唯一方法是直接转到pthreads / Win32 / Java / .NET /任何同步对象,而不是在线程中使用包装器.
如果它发生的话,你会怎么处理?好吧,期货是用纯Python实现的,它是非常简单的Python,并且有一个功能齐全的backport,可以使用2.5 /3.2.所以,你只需抓住那个backport并换掉concurrent.futures进行期货交易.
所以,如果你正在做一些古怪的事情,比如部署一台将在无人看管的情况下运行5年的服务器,并且可能会在其下面反复升级Python,那么我现在可以安装后端并使用它.
否则,我只是在适当的位置记录假设(以及在它被破坏的情况下的解决方法),然后只使用stdlib模块.