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

前端之家收集整理的这篇文章主要介绍了python – 使用带有greenlets / gevent的concurrent.futures.Future前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

如果它发生的话,你会怎么处理?好吧,期货是用纯Python实现的,它是非常简单的Python,并且有一个功能齐全的backport,可以使用2.5 /3.2.所以,你只需抓住那个backport并换掉concurrent.futures进行期货交易.

所以,如果你正在做一些古怪的事情,比如部署一台将在无人看管的情况下运行5年的服务器,并且可能会在其下面反复升级Python,那么我现在可以安装后端并使用它.

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

猜你在找的Python相关文章