【问题标题】:Named Pipe in python dies when multiprocessingpython中的命名管道在多处理时死亡
【发布时间】:2016-03-18 20:57:15
【问题描述】:

第一个问题,所以请温柔。

我正在使用 python。 当创建一个命名管道到一个 c++ windows 程序时使用

    PIPE = open(r'\\.\pipe\NamedPipe','rb+',0)

作为全局,我可以从管道读取/写入管道。

    def pipe_writer():
        PIPE.write(some_stuff)

    def pipe_reader():
        data = struct.unpack("byte-type",PIPE.read(number_of_bytes),0) 

    pipe_writer()
    pipe_reader()

这很好,可以从管道中收集数据并使用多个函数处理完整的数据,一个接一个的函数。

不幸的是,当我以序列化的方式从管道中提取数据时,我必须一点一点地处理数据。

我认为对数据进行排队就可以完成这项工作,所以我使用了多进程模块。

当我尝试多进程时,我能够创建管道并在打开管道后发送一次数据:

    if __name__ == '__main__':
    PIPE = open(r'\\.\pipe\NamedPipe','rb+',0)

    PIPE.write(some_stuff)

当我尝试将.start() 函数作为进程并从管道中读取时,我收到一个错误,指出管道不存在或以错误的模式打开,这实际上不可能,因为它工作得很好当在函数上不使用 Process() 读取/写入它时,我可以写入它......即使它只有一次。

有什么建议吗?另外我认为我有点需要使用多进程,因为线程不起作用......可能......因为 GIL 和减慢速度。

【问题讨论】:

  • pythonc++?对我来说,它看起来很纯粹python。不幸的是,使用c++ 标签,python 专家可能会回避回答您的问题。
  • 管道来自 c++ 程序,我正在工作 100% python 抱歉没有指定,第一个问题
  • 如何打开管道? pipe = (r'...', 'rb+', 0) 只是创建了一个包含两个字符串和一个 int 的 3 元组......
  • 因为我使用 PIPE = open(r'...', 'r+b', 0)。再次抱歉!让电脑上的代码在工作。也会有问题的编辑
  • 如果我正确理解了您的问题,您将在一个进程中打开管道并尝试在另一个进程中使用它。在无法运行的 Windows 下,请参阅 rhodesmill.org/brandon/2010/…

标签: python multithreading pipe multiprocessing named-pipes


【解决方案1】:

如果您也可以控制 C++ 源代码,则可以继续使用 ZeroMQ 或 Nanomsg 代替管道,使用 Google 协议缓冲区代替自己解释字节流,从而节省大量代码和麻烦.

ZeroMQ 和 Nanomsg 就像网络/管道/IPC 一样,比原始管道、套接字等更容易使用。源代码更少,功能更多:双赢。

Google 的协议缓冲区允许您以与语言无关的方式定义数据结构(消息),然后自动生成 C++、Python、Java 或其他语言的源代码。此源代码定义了表示消息的结构、类等,并将它们转换为标准二进制格式。您将通过 ZeroMQ 发送该二进制数据。同样,您要编写的源代码更少,功能更多。

这是将 C++ 类导入 Python 的理想选择,反之亦然。

【讨论】:

  • 不幸的是,我无法更改 C++ 代码。必须想出一个 Python 解决方案。还想了解为什么管道在以一种方式使用时可以工作,但在我尝试将它与多处理一起使用时却不起作用。
【解决方案2】:

nanomsg Python 包装器也可以在 GitHub 上的 Nanomsg Python 上获得。

您可以在Examples 看到示例。我想这个包装器会达到你的目的。使用它来代替原始 PIPE 总是更好。它支持 IPC、Between Process 和 TCP 通信模式。

而且它是跨平台的,它的基本实现是在C中。所以我想python和C进程之间的通信也可以实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多