高效的Python进程间通信
我正在用Python3开发一个应用程序,这个程序分为两个部分:batch
和gui
。Batch
部分负责处理逻辑,而gui
部分则负责显示这些逻辑。
我想知道应该使用哪种进程间通信(IPC)框架,以下是我的一些要求:
- GUI可以在与batch不同的设备上运行(比如GUI可以在同一设备上、智能手机、平板电脑等本地或通过网络运行)。
- batch部分(Python3 IPC库)应该能在Linux、Mac、Windows等系统上顺利运行。
- IPC应该支持用不同语言编写的GUI(比如Python、Javascript等)。
- IPC的性能很重要——它应该尽可能“互动”,但又不能丢失信息。
- 多个GUI可以连接到同一个batch。
补充:如果GUI也保证用Python编写,选择会有所不同吗?
编辑:我发现了很多IPC库,比如这里的高效的Python到Python IPC或者ActiveMQ、RabbitMQ、ZeroMQ等。
到目前为止,我找到的看起来最好的选项有:
- rabbitmq
- zeromq
- pyro
这些方案适合解决这个问题吗?如果不适合,为什么?如果有更好的方案,请告诉我原因。
5 个回答
你对这个框架的要求可真不少;需要网络功能、支持多平台、多语言,还要高性能(这里的高性能最好再具体说明一下,比如说带宽、延迟等,什么样的性能算是“足够好”?是说每秒几千字节、几兆字节还是几吉字节?延迟是1毫秒还是1000毫秒的往返时间?)而且还有很多没提到的因素,比如你是否需要身份验证或加密?有些框架可以提供这些功能,而有些则需要你自己来实现。
可能没有一种“灵丹妙药”的产品能同时满足你所有的要求。至于你问题中的“额外”部分——如果你把语言限制在Python,或者进一步区分哪些是关键需求、哪些是可有可无的需求,那么可选的解决方案会更多。
你可以看看一种技术叫做 Versile Python(我得说明一下,我是这个项目的开发者之一)。它支持多平台,并且兼容Python v2.6+/v3和Java SE6+。至于性能,这要看你的具体需求。如果你对这项技术有任何问题,可以在 论坛 上问我。
我用过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的字典/数组和字符串之间转换——不过“pickle”可能是更好的选择,用于Python之间的通信,因为JSON意味着“另一边”的代码可以用任何语言写。
现在Redis还有很多其他的用途——而且它们本质上都同样简单。
你提到的这三个选项看起来都挺合适的,能够满足你的需求。我觉得你应该选择你最熟悉、最舒服的那个。
根据我的个人经验,我认为ZeroMQ在效率、易用性和兼容性方面是最好的选择。我在把zmq 2.2和Python 2.7结合时觉得很简单,所以这就是我个人的最爱。不过,正如我所说的,我相信这三个框架都不会让你失望。
稍微相关一点的是:需求随着时间会变化,你可能会决定以后换框架,所以把对框架的依赖封装起来是个不错的设计思路。比如,可以有一个单独的模块来处理框架的交互,然后这个模块的接口使用你内部的数据结构和领域语言。