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

2024-06-28 20:02:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我用的是python。 创建指向c++windows程序的命名管道时

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

作为全局,我可以读/写管道。在

^{pr2}$

从管道中收集数据并使用多个函数(一个接一个函数)处理完整的数据是很好的。在

不幸的是,我必须一点一点地处理数据,因为我用几个函数以序列化的方式从管道中提取数据。在

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

当我尝试多处理时,我可以创建管道并在打开管道时发送一次数据:

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

    PIPE.write(some_stuff)

当我尝试.start()将函数作为进程并从管道中读取时,我得到一个错误消息,即管道不存在或以错误的模式打开,如果不在函数上使用Process()对其进行读/写操作,则不会出现这种情况,我可以对其进行写入。。。即使只有一次。在

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


Tags: 数据函数程序管道进程windows错误open
2条回答

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

您可以在Examples上看到示例。我想这个包装纸能满足你的需要。最好用这个代替原管道。它支持进程和TCP通信模式之间的IPC。在

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

<>如果你也控制C++源代码,你可以通过使用ZeOMQ或NANOMSG代替管道和谷歌协议缓冲区来节省大量代码和麻烦,而不是自己解释字节流。在

ZeroMQ和Nanomsg类似于networks/pipes/IPC,比原始管道、套接字等更易于使用。您的源代码更少,功能更多:双赢。在

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

<>这是将C++类变成Python的理想方法,反之亦然。在

相关问题 更多 >