2011-02-09 98 views
19

我在尋找一種簡單的將消息從一個進程(Perl腳本,短暫運行)傳遞到另一個進程(Python腳本,長時間運行)的方式 - 同一進程的本地進程。 我已經做了一些研究,但是我發現的是在我頭上或者看起來不必要的複雜 - 讓我有點迷茫和困惑。簡單的進程間通信

我粗略地想象一個小例子,像下面這樣:

# listener.py 

class Listener: 
    def __init__(self, port) 
     self.port = port 

    def on_message(self, msg): 
     print "%s: %s" % (timestamp, msg) 

recipient = Listener(1234) 


# sender.pl 

sub send_message { 
    my ($msg, $port) = @_; 
    # ... 
} 

send_message("hello world", 1234); 

如何解決和/或在何處這一念起來,將不勝感激任何指針!

+2

爲什麼你不直接在shell中使用OS管道? `python somescript.py | perl otherscript.pl`應該可以很好地工作。沒有插座。 – 2011-02-09 20:35:30

+0

通過POSIX-MQ風格的消息發送還是可以用套接字解決? – Xailor 2011-02-09 20:50:30

+1

Python腳本是一個長期運行的過程,並且管道消息只能在一次性基礎上工作(我認爲 - 您不能管道化到現有流程,您可以嗎?)。爲了構成一個愚蠢的例子,想象一下`Listener`是一個顯示傳入消息的桌面小部件(有點像`tail -f mylog`)。 – AnC 2011-02-09 20:50:49

回答

20

事實證明,進程間通信雖然表面上很簡單,但實際上充滿了複雜性。無論任何人在簡單答案方面告訴你什麼,請記住,可能有很多警告沒有提供。

現在,隨着這種免責聲明,我聲稱你可能想要的是消息隊列。這是基於你在示例api中沒有包含IP地址的事實。如果你需要穿越機器,你會需要套接字。不過,我認爲如果你能處理這個事實,那就是隻用於與同一臺機器上的進程通信,你會發現消息隊列更容易理解。

Perl的一個很好的出發點是:
http://perldoc.perl.org/IPC/Msg.html

的蟒蛇,這似乎可以解釋(忽略其他類型的IPC像信號燈):
http://semanchuk.com/philip/sysv_ipc/

10

而對於上電的通信與套接字的風格相同,請考慮查看0MQ。它可以利用不同的通信技術,具體取決於您的兩個應用程序的位置,即使是本地流程,它也非常易於使用併爲您解決問題。

http://zeromq.org