繁体   English   中英

多处理时python中的命名管道死亡

[英]Named Pipe in python dies when multiprocessing

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

我正在使用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和缓慢的东西。

如果您也可以控制C ++源代码,则可以继续使用ZeroMQ或Nanomsg(而不是管道)和Google Protocol Buffers(而不是自己解释字节流),从而节省大量代码和麻烦。

ZeroMQ和Nanomsg类似于类固醇上的网络/管道/ IPC,并且比原始管道,套接字等易于使用。您的源代码更少,功能更多:双赢。

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

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

nanomsg python包装器也可以在GitHub的Nanomsg Python上找到。

您可以在“ 示例”中看到示例 我想这个包装器会达到您的目的。 最好使用它代替原始的PIPE。 它支持IPC,进程间和TCP之间的通信模式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM