【问题标题】:simple inter-process communication简单的进程间通信
【发布时间】:2011-06-24 10:07:00
【问题描述】:

我正在寻找一种简单的方法来将消息从一个进程(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 相当抽象/通用的原因。答案为我提供了足够的数据,让我对什么是什么有一个基本的了解,所以我对结果很满意,我相信它会对处于类似情况的其他人有用。

标签: python perl ipc


【解决方案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 中更多基本的socket-stuff

    【讨论】:

    • 目前,我将使用套接字——主要是因为我找到了一个简洁的教程:doughellmann.com/PyMOTW/socket/tcp.html 不过我会继续阅读这个主题,因为似乎有很多东西要学。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多