【发布时间】:2013-02-21 21:02:30
【问题描述】:
我正在用 Python 编写一个程序,我正在考虑使用本地客户端-服务器模型,但我正在努力找出服务器与客户端通信的最佳方式。一个简单的、固定的解决方案是最好的——我不想重新发明轮子。这是我对这个程序的需求:
- 在 Linux 上运行
- 服务器和客户端在同一个系统上,所以我不需要通过网络。
- 可能不会让交互式用户感到厌烦的延迟。
- 多个客户端可以连接到同一个服务器。
- 客户端独立于服务器启动,可以随时连接/断开连接。
- 客户数以数十计;我不需要扩展得很高。
- 客户端可以有几种不同的风格:
- 流读取器 - 读取连续的数据流(实际上,这都是文本)。
- 状态读取器 - 读取一些不时更新的状态信息。
- Writers - 向服务器发送一些数据,每次都会收到一些响应。
客户端类型 1 看起来很简单;这是一个单向哑管。客户端类型 2 更有趣一些。我想避免简单地轮询服务器以定期检查新数据,因为这会给用户增加明显的延迟。当状态信息更新时,服务器需要某种方式向所有且仅相关的客户端发出信号,以便客户端可以从服务器接收更新的状态。客户端类型 3 必须是双向的;它会将用户提供的数据发送到服务器,并在每次发送后接收某种响应。
我查看了 Python 的 IPC 页面 (http://docs.python.org/2/library/ipc.html),但我认为这些解决方案都不适合我的需求。 subprocess 模块完全不合适,其他一切都比我想要的低级。
类似的问题Efficient Python to Python IPC 不太一样;我不需要传输 Python 对象,我并不特别担心我将拥有的客户端数量的 CPU 效率,我只关心 Linux,而且这个问题的答案都没有对我特别有帮助。
更新:
我不能接受一个只是将我指向框架/库/模块/工具的答案,而实际上没有解释它如何用于我的三种不同的服务器-客户端关系。如果你说,“所有这些都可以通过命名管道来完成!”我将不得不问“如何?”代码 sn-ps 将是理想的,但解决方案的高级描述也可以工作。
【问题讨论】:
-
PyRo(Python 远程对象)怎么样?
-
@BartekBanachewicz 这似乎是为以 Python 对象的形式来回传递较短的特定消息而设计的,因此它适用于客户端类型 3(发送消息,接收响应),但似乎不太适合客户端类型 1(开放式流)和 2(需要我试图避免的定期轮询)。
标签: python linux client-server ipc