简单的进程间通信

Posted

技术标签:

【中文标题】简单的进程间通信【英文标题】:simple inter-process communication 【发布时间】:2011-02-09 20:32:34 【问题描述】:

我正在寻找一种简单的方法来将消息从一个进程(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);

任何关于如何解决和/或在哪里阅读此问题的指针将不胜感激!

【问题讨论】:

你为什么不使用直接在 shell 中可用的 OS 管道? python somescript.py | perl otherscript.pl 应该可以正常工作。没有插座。 通过 POSIX-MQ 样式的消息发送还是可以使用套接字解决? Python 脚本是一个长期运行的进程,并且管道消息只能在一次性的基础上工作(我认为 - 你不能管道到现有进程,对吗?)。举一个愚蠢的例子,假设Listener 是一个显示传入消息的桌面小部件(有点像tail -f mylog)。 @S.Lott:我以为我做到了!?无论如何,我目前正在阅读套接字和消息队列,当我有更多见解时会接受答案。 FWIW,我不是在寻找特定问题的最佳解决方案,而是试图了解一般概念 - 这就是我保持 OP 相当抽象/通用的原因。答案为我提供了足够的数据,让我对什么是什么有一个基本的了解,所以我对结果很满意,我相信它会对处于类似情况的其他人有用。 【参考方案1】:

事实证明,进程间通信虽然表面上很简单,但实际上却充满了复杂性。无论有人在这里以简化的答案告诉您什么,请始终牢记,可能有很多警告没有说明。

现在,有了免责声明,我声称您可能想要的是消息队列。这是基于您没有在示例 api 中包含 IP 地址的事实。如果您需要跨越机器,您将需要套接字。但是,我认为如果您能够处理这仅用于与同一台机器上的进程通信的事实,您会发现消息队列更易于理解。

perl 的一个很好的起点是:http://perldoc.perl.org/IPC/Msg.html

对于 python,这似乎可以解释(忽略其他类型的 ipc,如信号量):http://semanchuk.com/philip/sysv_ipc/

【讨论】:

引用 Python 链接:这描述了 sysv_ipc 模块,它使 Python 可以访问大多数(全部?)上的 System V 进程间信号量、共享内存和消息队列*nix口味。示例包括 OS X、Linux、FreeBSD、OpenSolaris 2008.11 和(可能)AIX。它也可以在带有 Cygwin 之类的库的 Windows 下工作。【参考方案2】:

对于与套接字相同样式的通电通信,请考虑查看 0MQ。它可以根据您的两个应用所在的位置使用不同的通信技术,即使对于本地进程,它也非常易于使用并为您解决问题。

http://zeromq.org

【讨论】:

【参考方案3】:

一般来说,您对套接字感兴趣。获取所需粗略信息的好地方是 IO::Socket::INET 的文档或来自 perldoc perlipc 的 perl 中的更多基本套接字材料

【讨论】:

目前,我将使用套接字——主要是因为我找到了一个简洁的教程:doughellmann.com/PyMOTW/socket/tcp.html 不过我会继续阅读这个主题,因为似乎有很多东西要学。

以上是关于简单的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

进程间的通信简单总结

进程间通信

简单的进程间通信

简单的进程间通信

进程间通信——管道

使用环境变量进行简单的进程间通信