【问题标题】:Predefined Protocol for Communicating Over stdin/stdout/pipes in Python?在 Python 中通过标准输入/标准输出/管道进行通信的预定义协议?
【发布时间】:2011-07-22 23:44:22
【问题描述】:

我有一个进程创建了几个在 Python 2.5 中需要与之通信的子进程。我使用 subprocess 模块启动进程,将 stdin 和 stdout 设置为 subprocess.PIPE。到目前为止一切顺利。

然后,在一个循环中,我在每个子进程的标准输出流上运行 select.select() 等待它们告诉我它们准备好了。然后我写信给他们的标准输入,让他们工作并重复这个过程。

目前,我只是使用 stdin.write 和 stdout.readline 来进行通信。但是,我希望能够在进程之间传递复杂的消息。简单的换行符终止消息是不够的(除非我采取措施以某种方式转义消息中的新行)。我想我可以在所有消息前面加上字节长度,这样我的消息看起来像:

6:foobar

但这让我想到了我的问题:这样的东西已经存在了吗?我真的不想在这里重新发明轮子。我想要一个库,它可以告诉我何时准备好完整的消息并将其交给我。有许多其他协议以各种方式(TCP、消息队列服务器、HTTP 等)做这样的事情,但它们对于我的用例来说都是多余的。在 Python 中的进程之间进行消息传递的正确方法是什么?

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    您可以使用jsonpickle 对包含消息的数据结构进行编码,然后在另一端使用相同的结构来读取消息。

    【讨论】:

    • 当然,但我仍然需要担心转义或以其他方式定义消息的边界,不是吗? (也许 JSON 转义了新行,我不确定 Pickle。)我还想确保,如果消息是分段通过的,由于缓冲,我不会错过任何内容。
    • 如果消息不是太大,也不是太快,我认为让select 处理它没有问题。如果您发现消息速率存在问题,那么您可能需要查看一个可以处理串联消息的渐进式解析器。
    • 快速浏览 cPickle 会发现它在其字符串中添加了新行,这意味着它自己不在桌面上:>>> print pickle.dumps("a\nb") S'a\ nb' p1 .
    • 您可以在输出之前使用string-escape 编解码器对其进行编码。
    【解决方案2】:

    有一些框架可以真正帮助您解决此类功能。如果您想发送更复杂的消息而不用担心同步问题。一些非常好的框架的例子是:

    这些框架大多在 TCP/IP 之上工作。处理你的东西的方法略有不同。但是,也许你应该考虑一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      相关资源
      最近更新 更多