pythonのマルチプロセスは、おそらくほとんどの人は、より効率的なコード効率を作るマルチコアCPUを最大限に活用することができ、前に使用してきました。
私たちは、multiprocessing.pool.Pool.mapの公式の使用を見て
マップ(FUNC、反復可能【、チャンク]) マップの並列等価()組み込み - で関数(これはしかし一つだけ反復可能な引数をサポート)。結果までのブロックがある準備ができて。 この方法は、それが別のタスクのようなプロセス・プールに送信するチャンクの数に反復可能にチョップ。これらのチャンクの(おおよその)サイズは、正の整数にチャンクサイズを設定することによって特定することができます。
まず、マルチパラメータの受け渡しパラメータになる方法
用法・マップは、関数funcのパラメータは、反復に渡すことができます。
我々は複数のパラメータを渡す必要がある場合、どのようにそれを行うには、
一つの方法は、リスト内のタプルの中に複数のパラメータを置くことですか、FUNCのパラメータとして渡されました
別のは、以下のパラメータを用いて新たな変数関数を得るためにいくつかの値の事前結合関数のパラメータ一部によって一部の機能、部分関数(部分関数)を使用することです。Pythonで、部分的な機能は、部分functools高階関数の機能によって実現されてもよいです。部分的な機能の一部を次のようにソース:
デフ部分(FUNC、* argsを、** キーワード): "" " 指定された引数の部分適用の新機能 およびキーワード 。""" もしはhasattr(FUNC、' FUNC ' ): 引数 = func.args + 引数 tmpkw = func.keywords.copy() tmpkw.update(キーワード) キーワード = tmpkw デルtmpkw FUNC = func.func デフ newfunc(* fargs、** fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) リターン FUNC(*(引数+ fargs)、** newkeywords) newfunc.func = FUNC newfunc.args = 引数 newfunc.keywords = キーワードは 返す newfuncを
また、使用することは非常に簡単です、例えば、我々は、入ってくるテキストは、ロック、三つのパラメータのデータは、私たちは、データは、その後、我々は最初の部分の機能を使用することができ、計算に渡され、マルチプロセスを使用する必要があります関数funcを、持っていますその後、新機能の形成の最初の関数、そこにデータを渡す新しい関数のパラメータにテキストとを確保ロック
functools インポート部分 DEF :FUNC(テキスト、ロック、データ) ...... PT = 部分(FUNC、テスト、ロック) #パラメータデータのみを渡す必要がPTの新しい機能を
これは、我々は、機能のpt pool.map機能を適用し、唯一のパラメータデータを渡すでことができます。
第二に、そしてより多くのプロセス間通信
例えば、私はこのリスト内の文章の中に、各プロセスの結果を持っている別の状況、相互に複数のプロセス間の通信は、あります。もちろん、我々はmultiprocessing.Manager()を使用する必要がある内部関数テキストに渡されたパラメータが、一般的なリストとしてこれを取り、すべてのプロセスに共有することができません。リストを()プロセス間通信のリストを確立するために使用することができ、紛争予防が、また、紛争の動作を防止するためのテキストプラスロックで。、渡すことができないロックを作成するためにmultiprocessing.Lock()注multiprocessing.Managerを使用する必要が()。ロックを()を作成します。multiprocessing.Manager()辞書を作成するために、あなたもそれは間違って行くことはありません複数の配信プロセスで使用できる変数を作成し、ロックをリストを作成することができます。たとえば、次のコード:
テキスト= multiprocessing.Manager()。リスト() ロック = multiprocessing.Manager()。ロック() プール = multiprocessing.Pool(プロセス= 4 ) データ =リスト(範囲(20 )) PT = 部分(FUNC、テキスト、ロック) pool.map(PT、データ) pool.close() pool.join()