2010-12-04 22 views
5

私はPythonマルチプロセッシングモジュールを調べていますが、次のコードが何も印刷しない理由を理解していません。 whileループがなければ、プログラムはWorker_1を期待どおりに出力します。予想通り、この作品Pythonマルチプロセッシング:ワーカー関数でwhileループを出力しない

私のシステム(Linux上のPython 2.6 & 2.7)で
import multiprocessing, time 

def worker1(): 
    print 'Worker_1' 
    while 1: 
     print 'Worker_1' 
     time.sleep(3) 
    return 

if __name__ == '__main__': 
    jobs = [] 
    p = multiprocessing.Process(target=worker1) 
    jobs.append(p) 
    p.start() 
+0

私はマルチプロセッシングモジュールのマスターではありません。今はテストできませんが、 'p.join()'を 'p.start()'の後ろに追加してみてください。サブプロセスの開始後にメインプログラムが終了した場合、サブプロセスは続行されますか?私はそうは思わないが、私は知らない。これは、あなたが望むときに労働者を止めるためにいくつかの嫌悪感を持たなければならないことに注意してください。代わりに、おそらくフォークモジュールを見てください。 –

答えて

2

、。あなたはどのプラットフォームを使用していますか?一部のプラットフォーム(Windows)では、全く新しいプロセスを作成して設定することによって、forkがエミュレートされます。私はいくつかstdoutが子プロセスに転送されていないと思われる。試してください:

  • threadingモジュール。スレッド内のイベントを待つだけで十分です。ファイルへ
  • なBSD、LinuxまたはSolarisなど、POSIX互換のプラットフォーム上でプログラムを実行
  • 出力する
+0

現在、私はEclipseとPyDevをWindowsで使っています。ファイルへの出力も機能しません。私はただ空のファイルを取得します。私が理解できないことは、whileループの意義です。ループなしの出力がありますが、出力はありません。 – chessweb

+0

sys.stdout.flush()を追加してみてください。 –

+0

'print(" something ")'がWindows上の子プロセスで動作しないとは思えません。 'fork'は理由ではありません。私は質問からPython 3.4のコードに移植してみました。そして、 '' multiprocessing.set_start_method( 'spawn') '](http://docs.python.org/3.4/library/multiprocessing.html)で期待される出力を生成します。 #contexts-and-start-methods)( 'fork'は自然に動作します)。 – jfs

0

あなたはIDLEを使用していますか?私はこれが問題だと思います。あなたが持っているコードは、コマンドラインから呼び出されたときにLinux上で動作します(3秒ごとに 'Worker_1'を出力します)。 IDLEで試してみるとすぐに止まります。これは、その中にp.join()がないため、すぐにメインプロセスが停止し、ワーカープロセスが停止するからです。明らかに、p.join()はLinuxのコマンドラインからは必要ではありませんが、とにかくお勧めします。

しかし、p.join()であっても、IDLEを使用しても、スクリプトはそこにしか置かれず、テキストも表示されません。これは、IDLEがstdoutをidlelib.rpc.RPCProxyに再ルーティングする奇妙な方法のために、私は思う。つまり、IDLEを使用している場合は、それが問題です。

+0

私はWindowsでPyDevでEcpliseを使用しています。 – chessweb

関連する問題