简单的进程间通信

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中提供的操作系统管道呢?python somescript.py | perl otherscript.pl应该可以很好地工作。无需使用套接字。 - S.Lott
1
Python脚本是一个长时间运行的进程,而管道消息只能在一次性基础上工作(我认为 - 你不能将其导入到现有进程中,对吗?)。举个愚蠢的例子,想象一下Listener是一个桌面小部件,显示传入的消息(有点像tail -f mylog)。 - AnC
Unix套接字/本地套接字被访问时像文件一样怎么样? - Aif
1
@S.Lott:我以为我做到了!无论如何,我目前正在阅读关于套接字和消息队列的内容,当我有更深入的了解时会接受一个答案。 - AnC
1
就我个人而言,我并不是在寻找特定问题的最佳解决方案,而是试图了解这些概念的一般情况。这就是为什么我将问题描述得相对抽象/通用的原因。回答者们已经为我提供了足够的数据来了解基本情况,所以我对结果感到满意,并且我相信它对其他处于类似情况的人也会有所帮助。 - AnC
显示剩余5条评论
3个回答

20

事实证明,进程间通信表面上看起来很简单,实际上充满了各种复杂的问题。无论有人告诉你什么样的简化答案,在考虑到可能被遗漏的许多警告时,请谨记这一点。

现在,放下这个免责声明,我声称您可能想要的是消息队列。这是基于您的示例 API 中未包含 IP 地址的事实。如果需要跨越多台机器进行通信,您将需要使用套接字。但是,如果您可以处理仅用于与同一台机器上的进程通信的事实,那么我认为您会发现消息队列更容易理解。

对于 Perl 的良好入门点是:
http://perldoc.perl.org/IPC/Msg.html

对于 Python,以下内容似乎可以解释(请忽略其他类型的 IPC,如信号量):
http://semanchuk.com/philip/sysv_ipc/


引用自Python链接:这描述了sysv_ipc模块,它使Python可以在大多数(所有?)*nix flavor上访问System V进程间信号量、共享内存和消息队列。示例包括OS X、Linux、FreeBSD、OpenSolaris 2008.11和(也许)AIX。它也可能在Windows下使用像Cygwin这样的库工作. - ChaimG

11

如果您需要与 socket 相同的强大通信能力,可以考虑尝试 0MQ。它可以根据您的两个应用程序的位置利用不同的通信技术进行通信,并且即使是本地进程也非常易于使用并为您解决问题。

http://zeromq.org


3

一般而言,您对套接字很感兴趣。获取所需的基础信息的好地方是IO::Socket::INET文档或perldoc perlipc中更基本的perl套接字内容。


暂时而言,我会选择使用套接字 - 主要是因为我找到了一个简明的教程:http://www.doughellmann.com/PyMOTW/socket/tcp.html不过我会继续深入研究这个主题,因为似乎有很多可以学习的东西。 - AnC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接