高效的 Python IPC [关闭]

Posted

技术标签:

【中文标题】高效的 Python IPC [关闭]【英文标题】:Efficient Python IPC [closed] 【发布时间】:2013-01-17 13:28:52 【问题描述】:

我正在用 Python3 制作一个应用程序,它将分为 batchgui 部分。 Batch负责处理逻辑,gui负责展示。

我应该使用哪个inter-process communication (IPC) 框架并满足以下要求:

    GUI 可以在除批处理之外的其他设备上运行(GUI 可以在同一设备、智能手机、平板电脑等、本地或网络上运行)。 批处理(Python3 IPc 库)应该可以在 Linux、Mac、Windows 上正常运行... IPC 应支持用不同语言(Python、javascript 等)编写的 GUI IPC 的性能很重要 - 它应该尽可能“互动”,但不会丢失信息。 可以将多个 GUI 连接到同一个批次。

附加:如果保证 GUI 也可以用 Python 编写,是否会有其他选择?

编辑: 我找到了很多 IPC 库,比如这里:Efficient Python to Python IPC 或 ActiveMQ or RabbitMQ or ZeroMQ or。

到目前为止我发现的最好看的选项是:

rabbitmq zeromq 热火

他们是否适合解决这个问题?如果不是为什么?如果有更好的地方,请告诉我为什么。

【问题讨论】:

使用SocketServer 并通过套接字连接GUI。通过这种方式,您可以确定它可以在每个平台上运行,甚至可以通过网络运行。 谢谢。您能否请教一下为什么SocketServerzeromqrabbitmq 更好? 假设本地 IPC,使用套接字是一个可怕的选择,原因有很多。我个人推荐使用_winapi.ReadFile()_winapi.WriteFile() 以及来自传递给它的父句柄上的子进程的_winapi.DuplicateHandle() 的非标准匿名管道双工,因为它直接在RAM 中工作。 【参考方案1】:

您提到的三个似乎很合适,并且会满足您的要求。我认为你应该继续做你觉得最舒服\最熟悉的事情。

根据我的个人经验,我相信 ZeroMQ 是效率、易用性和互操作性之间的最佳组合。我很容易将 zmq 2.2 与 Python 2.7 集成在一起,所以这将是我个人的最爱。但是,正如我所说,我很确定这 3 个框架都不会出错。

半相关:需求往往会随着时间而变化,您可能会决定稍后切换框架,因此封装对框架的依赖将是一个很好的设计模式。 (例如,拥有一个与框架交互并让其 API 使用您的内部数据结构和领域语言的管道模块)

【讨论】:

【参考方案2】:

我为此使用了Redis 引擎。 非常 简单,并且轻量级

服务器端:

import redis
r = redis.Redis() # Init
r.subscribe(['mychannel']) # Subscribe to "channel"
for x in r.listen():
  print "I got message",x

客户端做:

import redis
r = redis.Redis() # Init
r.publish('mychannel',mymessage)

“消息”是字符串(任意大小)。如果需要传递复杂的数据结构,我喜欢使用 json.loads 和 json.dumps 在 python dicts/arrays 和字符串之间进行转换—— 对于 python 到 python 的通信,“pickle”可能是更好的方法,尽管 JSON 意味着“另一面”可以用任何东西编写。

现在 Redis 还有十亿种其他用途 - 而且它们本质上都一样简单。

【讨论】:

redis 不再那样工作了。图书馆里没有任何命令了,从我在互联网上收集到的内容来看,它基本上是一本非常好的字典。介绍性博文:realpython.com/python-redis【参考方案3】:

你对框架提出了很多要求;支持网络,多平台,多语言,高性能(理想情况下应该进一步指定 - 它是什么意思,带宽?延迟?什么是“足够好”;我们在谈论 kB/s、MB/s、GB/ s? 1 ms 或 1000 ms 往返?)另外还有很多没有提到的东西很容易发挥作用,例如您需要身份验证或加密吗?一些框架为您提供这样的功能,而另一些则依赖于您自己实现这部分难题。

可能不存在可以为您提供同时优化所有这些要求的理想解决方案的灵丹妙药。至于您问题的“附加”部分 - 是的,如果您仅将语言要求限制为 python,或者进一步区分关键要求和很好的要求,将会有更多可用的解决方案。

您可能想看看的一项技术是Versile Python(完全披露:我是开发人员之一)。它是多平台的,支持 python v2.6+/v3 和 java SE6+。关于性能,这取决于您的要求。如果您对该技术有任何疑问,请在forum 上提问。

【讨论】:

【参考方案4】:

解决办法是dbus

它是一个成熟的解决方案,可用于许多语言(C、Python、...,只需 google 用于 dbus + 您最喜欢的语言),虽然不如共享内存快,但对于几乎所有东西来说仍然足够快不需要(硬)实时属性。

【讨论】:

但是它可以通过网络工作吗? (另外 dbus 在 windows 和 macosx 上运行良好吗?) - 我现在已经在问题中添加了这些要求。【参考方案5】:

我将在这里采取不同的策略,说为什么不使用 Internet 上事实上的 RPC 语言? IE。 HTTP REST API?

使用客户端的 Python 请求和服务器端的 Flask,您可以获得以下好处:

Postman 等现有 HTTP REST 工具可以访问和测试您的服务器。 同样的工具可以记录您的 API。 如果您还使用 JSON,那么您将获得很多与之兼容的工具。 您将获得经过验证的安全实践和解决方案(基于会话的安全性和 SSL)。 这是许多不同开发人员熟悉的模式。

【讨论】:

以上是关于高效的 Python IPC [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭/清除 IPC 消息队列?

关闭默认共享,禁止ipc$空连接

针对大量小数据的 IPC 建议 [关闭]

将 > 500 MB xlsx 高效读取到 R 和 Python [关闭]

如何在java中发送ipc信号[关闭]

内存中的高效矢量位数据“旋转”/“重新排列”[例如在 Python 中,Numpy] [关闭]