Python在Linux上的灵活IPC解决方案?

7
我正在使用Python编写程序,考虑使用本地客户端-服务器模型,但我正在努力找出服务器与客户端之间最佳通信方式。一个简单的、预设好的解决方案是最好的——我不想重新发明轮子。以下是我对这个程序的需求:
  • 在Linux上运行
  • 服务器和客户端在同一系统上,因此不需要通过网络。
  • 延迟不会对交互用户造成烦恼。
  • 多个客户端可以连接到同一个服务器。
  • 客户端独立于服务器启动,可以随时连接/断开连接。
  • 客户端数量可测量为几十个;我不需要高度扩展性。
  • 客户端可以有几种不同的类型:
    1. 流读取器——读取连续的数据流(实际上,这都是文本)。
    2. 状态读取器——读取每隔一段时间更新的某些状态信息。
    3. 写入器——向服务器发送一些数据,在每次发送后接收一些响应。

客户端类型1似乎很简单;它是一个单向的愚笨的管道。客户端类型2更有趣。我希望避免定期轮询服务器以检查新数据,因为这会为用户增加明显的延迟。服务器需要一种方式来向所有相关客户端发出信号,而不是其他客户端,以便客户端可以从服务器接收更新后的状态信息。客户端类型3必须是双向的;它将向服务器发送用户提供的数据,并在每次发送后接收某种响应。

我查看了Python的IPC页面(http://docs.python.org/2/library/ipc.html),但我认为那些解决方案都不适合我的需求。子进程模块完全不合适,其他所有东西都比我想要的低级别。

类似的问题Efficient Python to Python IPC并不完全相同;我不需要传输Python对象,我对我将拥有的客户端数量的CPU效率并不特别担心,我只关心Linux,而且那个问题的答案对我来说也没有什么帮助。

更新:

我不能接受只指向框架/库/模块/工具的答案,而没有实际给出如何用于我的三种不同的服务器-客户端关系的解释。如果你说:“所有这些都可以使用命名管道完成!”我必须问:“怎么做?”代码片段是理想的,但高级别的解决方案描述也可以。


PyRo(Python 远程对象)怎么样? - Bartek Banachewicz
@BartekBanachewicz 这似乎是为了以Python对象的形式传递较短、具体的消息来回传递而设计的,因此对于客户端类型3(发送消息、接收响应)可以使用,但对于客户端类型1(开放式流)和2(需要避免定期轮询的客户端)则似乎不太合适。 - user108471
1个回答

3

你是否已经了解过ZeroMQ?它有很好的Python支持,并且文档中的示例已经涵盖了你的使用情况。

在单个平台、单台机器上使用非常简单,但是可以非常容易地扩展到网络上。


乍一看,这个库有很多优点。但是我没有看到文档中覆盖我的实际应用案例的示例。尽管有许多示例,但要找到适合我的可能需要花费一些时间。能否指向你发现的相关示例,以便我更快地评估这个库? - user108471
1
我会在自己处理完堆栈后尽快更新答案。 :)同时,这可能会给您一个很好的介绍: http://www.slideshare.net/fcrippa/europycon2011-implementing-distributed-application-using-zeromq我看到“状态读取器”的发布/订阅和其他客户端的推送/拉取(有一个关于请求-响应风格的整个章节)。 - Davide R.
谢谢。在阅读更多关于ZeroMQ的内容时,我发现了这个StackOverflow答案:https://dev59.com/u3RB5IYBdhLWcg3wETxJ#1687696,其中声称“Zmq支持许多高级消息场景,但是...你将不得不通过组合框架的各种部分来实现大部分功能...”这可能使ZeroMQ不太理想。当然,如果示例实现了与我想要的相似的东西,那可能就没有什么意义了。 - user108471

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接