2012-01-05 44 views
0

我需要2个进程进行通信。要么可以单独运行,但是当它们一起运行时,它们应该进行通信。他们每分钟只发送几个字节给对方。都不被认为是“主人”或“客户”。Python 2进程在套接字上通信

我试图做一个类,它在后台处理。例如,它首先尝试连接到套接字,如果它失败,它会尝试收听等。当一个程序终止时,另一个接管收听,等等。经过长时间的挣扎后,我放弃了。有太多的错误,我不能使它可靠地工作。

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

回答

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! 

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

3

使用0mq,带有两对PUB/SUB插座。