Pythonのマルチプロセスの例示的説明

EDITORIAL:あなたはマルチコアCPUリソースを最大限に活用したい場合は、本当に真のマルチスレッドではありませんpythonでマルチスレッド、ほとんどのケースでは、Pythonで複数のプロセスを使用する必要があります。Pythonは機能のみを定義する必要があり、マルチプロセスパッケージのマルチプロセッシングを非常に使いやすいを提供し、Pythonは他のすべてのものを行います。このパッケージで、容易にするために単一のプロセスから行うことができ、同時に実行変換。

1. multiprocessingモジュールが提供するProcessプロセスオブジェクトを表すクラス

OSのインポート
インポート時間
DEFのrun_proc(名):コード#子プロセスの実行に
    印刷する' 実行サブプロセス%sに、子プロセスID(%s)を... '(名前、os.getpid())
    を印刷" I処理内容は以下のとおりです。?%S%S + = "(名前、名前)
     戻り

IF __name__ __ == ' __main__ ' 
    印刷' 親プロセス番号S%'%のos.getpid()
    印刷(" --- ------------------------------------- " のための I におけるレンジ(3。 ):
        PMultiprocessing.Process =(= run_procターゲット、引数= (I))#複数のプロセスの
        印刷子プロセス%dをオープン... i個の
        p.start()#のjoin()メソッド子プロセスの終了がダウンして実行し続けた後、待つことができます、一般的にプロセスの間の同期のために使用
        p.join()
        印刷サブプロセスは、%D ...終了Iの
        プリント

結果は以下の通りであります:

親プロセスIDがある3378  ---------------------------------------- 
子プロセスのオープン0 ... 
サブプロセス実行0、子プロセスの数(3642は)... 
私の処理内容は次のとおりです。0 + 0?= 
子プロセスが終了... 0 

子プロセスのオープン... 1つの
実行サブプロセス1、子プロセス号(3649 )... 
私の処理内容は次のとおりです。1 + 1 =?
子プロセス1つの終了... 

オープン子プロセス... 2 
実行サブプロセス2、サブプロセスID(3656 )... 
私の処理内容は次のとおりです。2 + 2?= 
子プロセスが終了2 ...

あなたはマルチプロセスのプロセスを処理することによって得られた結果を返すようにしたい場合は、あなただけが少しコードを変更し、マルチプロセッシングにマネージャークラスを使用する必要があります。

OSのインポート
インポート時
からのインポートマネージャマルチプロセッシング
コード#子プロセスを実行するために:DEFのrun_proc(名前、return_list)を
    印刷する実行サブプロセス%sに、子プロセスID(%のS)... %を(名前、os.getpidを())
    印刷" 私は、コンテンツを処理していた?:%S%S + = "(名前、名前)
    return_list.append(名前を)

IF __name__ __ == ' __main__ ' 
    印刷' 親プロセス番号S%を'%のOS .getpid()
    印刷(' ---------------------------------------- ' 
    
    マネージャー = マネージャー()
    return_list = manager.list()
    #return_dict = manager.dict()あなたはまた、辞書辞書を使用することができる
    
    ため、私範囲(3 ):
        P- = multiprocessing.Process(= run_procターゲット、引数= (I、return_list))#のマルチプロセス
        印刷' サブプロセス%dのオープン... '%のIの
        p.start()
        p.join()
        印刷する' サブプロセスが終了した%D ... 'Iが
        印刷
    印刷return_listで得られたすべての子プロセスの結果を、値:"、return_list

結果は以下の通りであります:

親プロセスIDがある3378  ---------------------------------------- 
子プロセスのオープン0 ... 
サブプロセス実行0、子プロセスの数(4569は)... 
私の処理内容は次のとおりです。0 + 0?= 
子プロセスが終了... 0 

子プロセスのオープン... 1つの
実行サブプロセス1、子プロセス号(4579 )... 
私の処理内容は次のとおりです。1 + 1 =?
子プロセス1つの終了... 

オープン子プロセス... 2 
実行サブプロセス2、サブプロセスID(4589 )... 
私の処理内容である:2 + 2?= 
子プロセス... 2端

すべての子プロセスの結果はreturn_listで処理された、値は[ 012 ]

 

2.Pool:あなたは子プロセスの多数を開始したい場合は、子プロセスを作成するバッチにプールの道を処理するために使用することができます。

プールのインポートマルチプロセッシング
インポートOSを、時間、ランダム

DEFのlong_time_task(名):
    印刷' タスク%sが実行されている、子プロセスID(%S)... '(名前、os.getpid())
    
    印刷私は息子ですいいえプロセス(%sの)処理されたコンテンツ"(os.getpid())
    スタート = time.time()
    time.sleepを(はrandom.Random() * 3 
    エンド = time.time()
    印刷" タスク%sの%0.2Fセカンドラン。'%(名前、(エンド- スタート))
     リターン

IF __name__ __ == ' __main__' 
    印刷' 親プロセス番号S%。'Os.getpid()
    RST = [] 
    P =プール(4 )#4のサブプロセスのプロセス・プールに含まれている
     ため I レンジ(5 ):4つのサブプロセスが完了した#5タスクなので、このようなアイドル再処理等の処理を必要とするタスクがあり
        、A = p.apply_async(long_time_task、引数= (私は、))#Aプロセスハンドラlong_time_taskの結果が返され
        rst.append(a)は#回結果は最初に行く配列に追加された
    印刷をすべての子を待つ終了を処理... 
    p.close()
    すべての子プロセスのp.join()#待ちが終了します。最初の呼び出しは)()(参加を呼び出す前に閉じる必要があります後、(クローズを呼び出して)新しいプロセスを追加し続けることはできません。
    印刷するには、すべての子が終わりを処理し... 

結果は以下の通りであります:

親プロセスIDがある3378 
タスク実行0を、子プロセスの数(4621 )... 
タスクの実行2を、子プロセス番号(4624が)... 
タスクの実行1、子プロセス番号(4622を)... 
と私は思い子プロセスID(4621 の内容を含む)の契約
私の息子は、プロセスIDです(4622 コンテンツとの)契約
実行中のタスク3、子プロセスの数(4627 )... 
私は(子プロセスID午前4624 コンテンツを含む)の契約
と私は子プロセスID(4627の内容)処理
タスクは1実行中の0.16 秒の
タスクを実行するために4を、子プロセスの数(4622 )... 
私は子プロセスID午前(4622)コンテンツの処理の
すべての子を待っているの終わりを処理... 
タスク2が走った0.98 秒。
タスク4走った0.89 秒。
タスク3走っ2.25 秒を
タスク0が走った2.89 秒を
すべての子プロセスを終了するには...

直接出力RSTは、望ましい結果を得ることはありません。

RST 
运行结果:
[ <でmultiprocessing.pool.ApplyResult 0x7ffa6c682c90 >  <multiprocessing.pool.ApplyResultで0x7ffa6c587590 >  <multiprocessing.pool.ApplyResultで0x7ffa6c587610 >  <multiprocessing.pool.ApplyResultで0x7ffa6c5876d0 >  <multiprocessing.pool。でApplyResult 0x7ffa6c587790 >]

これは、()メソッドを使うに.getする必要があることです:

= [Iは。RST GET()のための I におけるRST] 
RSTの
結果:
[ 01234 ]

 

おすすめ

転載: www.cnblogs.com/USTC-ZCC/p/11230827.html