2016-03-18 9 views
0

最初の質問ですので優しくしてください。マルチプロセッシング時にPythonの名前付きパイプが死ぬ

私はpythonを使用しています。 私はパイプからとの読み出し/書き込み可能なグローバルとして

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

とC++の窓のプログラムに名前付きパイプを作成します。

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() 

これはパイプからデータを収集し、いくつかの機能と完全なデータを処理し、次々に機能する細かいあります。

残念ながら、シリアル化された方法でいくつかの関数を使ってパイプからデータをプルする際に、データを少しずつ処理する必要があります。

私はマルチプロセスモジュールを使用するので、データをキューに入れるだけで仕事ができると思っていました。

私はマルチしようとしたとき、私はパイプを作成し、それを開いたときにした後、一度データを送信することができる午前:私は、その後のプロセスとして.start()機能を試してみて、私が手パイプから読み込むとき

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

    PIPE.write(some_stuff) 

パイプが存在しないか、間違ったモードで開いているというエラーです。実際には関数上でProcess()を使わずに読み書きするとうまく動作するわけではありません。たとえそれが一度だけであっても。

提案がありますか?また、スレッド処理がうまくいかず、マルチプロセスを使う必要があると思います...おそらく... GILとスローダウンのためです。

+0

'python'または' C++ '?それは私には純粋な 'python'と思われます。残念なことに、 'C++'タグでは、 'python'専門家があなたの質問に答えることを恥ずかしく思うかもしれません。 – alvits

+0

パイプはC++プログラムから来ていますが、私は100%のPythonを使っています。指定しないと申し訳ありませんが、fisrtの質問 –

+0

どのようにパイプを開きますか? 2つの文字列と1つのintを持つ3タプルを作成します... –

答えて

0

C++ソースコードを管理している場合でも、パイプの代わりにZeroMQまたはNanomsgを使用し、バイトストリームを解釈する代わりにGoogleプロトコルバッファを使用することで、多くのコードと手間を省くことができますあなた自身。

ZeroMQとNanomsgはステロイドのネットワーク/パイプ/ IPCと似ており、ソースパイプやソケットなどのソースコードよりもはるかに使いやすくなっています。

Googleのプロトコルバッファでは、データ構造(メッセージ)を言語に依存しない方法で定義し、C++、Python、Javaなどのソースコードを自動生成できます。このソースコードは、メッセージを表す構造体、クラスなどを定義し、標準バイナリ形式に変換します。そのバイナリデータはZeroMQ経由で送信されます。繰り返しますが、書くためのソースコードが少なく、より多くの機能があります。

これは、C++クラスをPythonに、またはその逆にするのに理想的です。

+0

残念ながら私はC++コードを変更することはできません。 Pythonのソリューションを考え出す必要があります。また、パイプが一方向で使用されている場合にはなぜ機能するのか理解したいと思いますが、マルチプロセッシングで使用しようとすると機能しません。 –

0

ナノムス pythonラッパーは、Nanomsg PythonのGitHubでも利用できます。

例はExamplesに表示されています。私はこのラッパーがあなたの目的を果たすだろうと思う。生のPIPEの代わりにこれを使用する方が良いでしょう。 IPC、プロセス間およびTCP通信パターン間をサポートしています。

また、クロスプラットフォームであり、基本的な実装はC言語です。だから、PythonとCプロセス間の通信も可能になると思います。

関連する問題