Python 2进程在socket上进行通信

时间:2012-01-05 08:05:12

标签: python ipc

我需要2个进程进行通信。要么可以单独运行,要么当它们一起运行时它们应该进行通信。它们每分钟只发送几个字节。两者都不被认为是“主持人”或“客户”。

我尝试创建一个在后台处理它的类。例如,它首先尝试连接到套接字,如果失败则尝试监听等。当一个程序终止时,另一个程序接管监听等等。经过长时间的努力,我已经放弃了。有太多的错误,我不能让它可靠地工作。

所以我想知道是否有一个好的替代解决方案,或者是否有一个强大的实现我可以使用的这类事情。我没时间愚弄了。我需要它在Windows和Linux上工作。

2 个答案:

答案 0 :(得分:3)

使用0mq和两对PUB / SUB套接字。

答案 1 :(得分:2)

如果您遇到套接字问题,可能需要考虑其他IPC机制。例如,named pipes让两个进程进行通信,就好像它们只是在文件中写入/读取一样。

以下示例显示了如何创建命名管道以及如何在两个不同的进程中打开以进行读写:

import os

pipe_name = '/tmp/ipc'

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)
    try:
        with open(pipe_name) as f:
            print 'Received:', f.read()
        with open(pipe_name, 'w') as f:
            message = 'Goodbye World!'
            print 'Sending:', message
            f.write(message)
    finally:
        os.remove(pipe_name)
else:
    with open(pipe_name, 'w') as f:
        message = 'Hello World!'
        print 'Sending:', message
        f.write(message)
    with open(pipe_name) as f:
        print 'Received:', f.read()

第一个过程将:

  • 创建命名管道
  • 收到消息
  • 发送另一条消息
  • 删除管道

而seconde过程只会:

  • 发送消息
  • 收到另一条消息

如果你在两个不同的终端上执行上面的例子,你会得到第一个:

Received: Hello World!
Sending: Goodbye World!

在第二个:

Sending: Hello World!
Received: Goodbye World!

注意:这只是一个例子。如果你需要双向通信,当你需要接收/发送消息时,使用两个命名管道而不是只打开一个用于读/写的管道会更方便。