Python中通过stdin/stdout/管道通信的预定义协议?

3 投票
2 回答
921 浏览
提问于 2025-04-16 14:25

我有一个程序,它会创建几个子进程,并需要与这些子进程进行通信,使用的是Python 2.5。我用subprocess模块来启动这些进程,并把标准输入和标准输出设置为subprocess.PIPE。到目前为止,一切都很顺利。

接下来,我在一个循环中,使用select.select()来检查每个子进程的标准输出流,等待它们告诉我准备好了。我然后向它们的标准输入写入数据,给它们分配任务,然后重复这个过程。

目前,我只是用stdin.write和stdout.readline来进行通信。不过,我希望能够在进程之间传递更复杂的信息。简单的以换行符结束的消息不够用(除非我想办法在消息中处理换行符)。我在想,能否在所有消息前面加上字节长度,这样我的消息看起来像这样:

6:foobar

但这让我想到了一个问题:有没有类似的现成解决方案?我不想重新发明轮子。我希望有一个库,可以告诉我什么时候有完整的消息准备好了,并把它交给我。虽然有很多其他协议以不同的方式实现了类似的功能(比如TCP、消息队列服务器、HTTP等),但对于我的需求来说,它们都太复杂了。那么,在Python中,进程之间传递消息的正确方法是什么呢?

2 个回答

1

有一些框架可以帮助你处理这类功能。如果你想发送更复杂的消息,而不想担心同步的问题,这些框架会很有用。以下是一些非常不错的框架:

这些框架大多是建立在TCP/IP协议之上的。它们的处理方式和你现在的做法稍有不同。不过,也许你可以考虑一下这些框架。

2

你可以用 json 或者 pickle 来把包含消息的数据结构进行编码,然后在另一边用相同的方法来读取这个消息。

撰写回答