加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:52:41 所属栏目:Python 来源:网络整理
导读:我有一个python库,通过多播执行异步网络,可以获得其他服务的回复.它通过返回一个捕获回复的Future来隐藏脏工作.我正在将这个库集成到现有的gevent应用程序中.呼叫模式非常简单: future = service.broadcast()# next call blocks the current threadreply =

我有一个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模块.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读