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中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...