簡體   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