2012-01-05 12 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插座。