2013-08-11 19 views
8

私はPythonのマルチプロセッシングを学ぼうとしています。例からPythonマルチプロセッシングのドキュメント例

http://docs.python.org/2/library/multiprocessing.html「含まれる個々のプロセスIDを表示するには、ここでの拡大の例である:」

from multiprocessing import Process 
import os 

def info(title): 
    print title 
    print 'module name:', __name__ 
    if hasattr(os, 'getppid'): # only available on Unix 
     print 'parent process:', os.getppid() 
    print 'process id:', os.getpid() 

def f(name): 
    info('function f') 
    print 'hello', name 

if __name__ == '__main__': 
    info('main line') 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

私はで正確に何を探していますか?私はdef f(name):info( 'main line')が終了した後に呼び出されますが、この同期呼び出しはデフォルトであることがわかります。私は、同じプロセス情報( 'main line')がdef f(name)の親PIDであることを知っていますが、それについては何が 'マルチプロセッシング'なのか分かりません。

また、join()では、 "join()メソッドが呼び出されるプロセスが終了するまで呼び出しスレッドをブロックします"。私は、呼び出しスレッドが何であるかについては明確ではない。この例では、join()はブロックされますか?

答えて

25

どのように一言で言えばmultiprocessing作品:

  • Process()スポーン(Unixライクなシステム上のforkまたは類似の)本当のforkを欠いWindowsの、上の元のプログラムのコピー(、これはトリッキーで、モジュールのドキュメントに注意する必要があります)。
  • コピーはオリジナルと通信して、(a)コピーであり、(b)オフになり、target=関数を呼び出します(下記参照)。
  • この時点で、元とコピーは異なる独立しており、同時に実行できます。

これらは独立したプロセスなので、(CPythonで)独立したグローバルインタープリタロックを持つようになり、両方のCPUがマルチCPUボックス上で最大100%のCPUを使用できるようになります。その他の低レベル(OS)リソースこれが「マルチプロセッシング」です。

当然のことながら、ある(または多くの)ワーカープロセスの結果を「メイン」プロセスに戻すなど、これらの想定外のプロセス間でデータをやりとりする必要があります。 (誰もが完全に独立している場合がありますが、それはまれです...さらに、起動シーケンス全体がp.start()で始まります)。したがって、上記の例ではProcess instance-pが作成され、その親クリエイターとその逆(これは対称的な接続です)。 multiprocessingモジュールはpickleモジュールを使用してデータを文字列に変換します。文字列はpickle.dumpでファイルに格納され、チャネルを横切ってデータを送信し、引数を送信するためにワーカーに「下向きに」送信し、ワーカーから「上向き」結果を返送する。

結局、結果が得られたら、ワーカーは(target=関数から戻ってきて)終了し、親に完了したことを伝えます。すべてがクローズされ、クリーンアップされるように、親はp.join()に電話をかけて、作業者の「やったんだ」メッセージ(実際にはUnix-ish sysemsのOSレベルのexit)を待つべきです。

2つの印刷されたメッセージには基本的に時間がかからないので、この例は少しばかげているので、「同時に」実行すると測定可能な利益はありません。しかし、単にhelloを印刷する代わりに、fは最初の10万桁のπ(3.14159 ...)を計算するものとします。 Processp2を別のターゲットgで生成し、最初の100,000桁のe(2.71828 ...)を計算することができます。これらは独立して実行されます。その後、親はp.join()p2.join()を呼び出して、両方が完了するのを待つことができます(または、より多くの作業を行い、より多くのCPUを占有し、さらには最初に仕事をしてからしばらくする)。

関連する問題