プログラムは、複数のプロセスを開始する必要がある場合は、スレッド・プール同様に、プロセスプールは、プロセスを管理するために使用することができます。プログラムすることができます()関数は、プールのマルチプロセッシングモジュールによってプロセス・プールを作成するプロセスプールは、実際にmultiprocessing.pool.Poolクラスです。
プロセス・プールには、以下の一般的な方法があります。
1.apply(FUNC [、引数[、kwds]]):関数funcは、プールのプロセスに提出されます。FUNCに渡された位置を表し引数、パラメータ、FUNCに渡されたキーワード引数の代わりにkwds。この方法は、関数funcの実装が完了するまでブロックされます。
2.apply_async(FUNC [、引数[、kwds [、コールバック【、error_callback]]]]):これは、非同期バージョンである適用()メソッドは、この方法はブロックされません。前記コールバック指定されたコールバック関数func関数が完了し、error_callback誤差関数funcをコールバック関数を指定します。
3.map(FUNC、反復可能【、チャンク ]) と同様 のPython のマップ()グローバル関数が、ここでは反復可能の各要素に関数funcを実行するために新しいプロセスを使用して。
4.map_async(FUNC、反復可能な[[チャンク・コールバックは[error_callback]]]):これは、マップ()メソッドの非同期バージョンでは、方法はブロックされません。前記コールバック指定されたコールバック関数func関数が完了し、error_callback誤差関数funcをコールバック関数を指定します。
5.imap(FUNC、反復可能【、チャンク]):これは、マップ()メソッドの遅延バージョンです。
6.imap_unordered(FUNC、反復可能【、チャンク]):関数類似IMAP()メソッドが、この方法は、(複数の要素を含む)生成された結果は反復可能の要素の元の順序と一致することを保証するものではありません。
7.starmap(FUNC、反復可能【、チャンク]):関数類似マップ()メソッドが、この方法はまた、関数funcようにパラメータをアンパックした後、各要素を要素反復可能反復可能オブジェクト、手順が必要であろう。
8.close():プロセス・プールを閉じます。このメソッドを呼び出した後、プロセスプールは、新しいタスクを受け入れることができない、それは現在のプロセス・プールのすべてのタスクを実行します自分自身の完了後に閉じられています。
9.terminate():すぐにプロセスのプールを一時停止します。
10.join():すべてのプロセスの完了を待ちます。
あなただけのプログラムがタスク実行プロセスプールに提出することにしたい場合は、(適用)またはapply_async()メソッドを呼び出すことができます。
アプリケーションが他のiterableのiterableに変換するために指定された機能を必要とする場合は、マップ()またはIMAP()メソッドを使用することができます
プロセスを開始するapply_async()メソッドを使用します
インポートマルチプロセッシング インポート時間 インポートOS DEFアクション(名前= ' デフォルト' ): 印刷(' (%S)処理が実行されている、パラメータは、Sの%'%(os.getpid()、名前)) time.sleep( 3。 ) IF __name__ == 「__main__ 」: #はプロセス4つのプロセスプールを作成する プール= multiprocessing.Pool(プロセス= 4 ) #プロセスプールに提出アクションは3回 pool.apply_async(アクション) pool.apply_async(アクション、引数 =(「位置パラメータ」、)) Pool.apply_async(アクション、kwdsは = { ' 名前':' キーワードパラメータ' }) pool.close() pool.join()
上記の手順からわかるように、プロセスは、コンテキスト管理プロトコルの同じプールを達成するために、あなたが手続きイニシアチブプロセスプールが閉じられている避けることができるようにプログラムは、プロセスのプールを管理するための句で使用することができます。
プロセスを開始するにはマップ()メソッドを使用します
インポートマルチプロセッシング インポート時間 インポートOSの #は、タスクとプロセスとして準備を定義 DEF アクション(最大): my_sum = 0 のために私にレンジ(最大): 印刷(「(%S)プロセスが実行されます。%D 」%(OS。 GETPID()、私は)) my_sum + = 私は 返すmy_sumを IF __name__ == ' __main__ ' : #はプロセスプールは、4つのプロセスが含ま作成 multiprocessing.Poolと(=プロセスを4。 )のプールをAS: #をマップ算出処理実行使用 #タプルの後ろには、三つの要素を有し、プログラムは、アクション実行するために、3つの機能の処理を開始する 結果を= pool.map(アクション、(50、100、150 )) を印刷(' ------- ------- " ) のための R&LT での結果: 印刷(R&LT)
プロセス間通信
Pythonは、通信処理のための2つのメカニズムを提供します。
1.Queue:キューにデータへのプロセスは、他のプロセスは、キューからデータを読み取ります。
2.Pipe:パイプは、2つのプロセスのパイプの代表を接続します。パイプコール()関数は、2つの通信処理にそれぞれ接続された2つの端部を生成し、以下の処理は、接続が、端末にデータを書き込むことができ、接続端からデータを読み出すことができます。
プロセス間通信を使用して、キュー
キュー内やQSIZEを提供し、実質的に類似したマルチプロセッシングモジュール、()、空()、下のキューのモジュールキューフル()、入れ()、put_nowait()、取得()、get_nowait() メソッドなどが挙げられます。違いは、唯一のサービス提供を処理するためにキューモジュールマルチプロセッシングでは、サービスを提供するために、スレッドのキューキューモジュールの下にあります。
キューは、プロセス間の通信を有効にするには、次の手順を実行します。
1 インポートマルチプロセッシング 2 。3 DEF F(Q)を: 4 プリント(' 率(%S)プロセスには、データを開始... '%のmultiprocessing.current_process()PID) 5。 q.put(' パイソン' ) 6。 IF __name__ = = ' __main__ ' : 7 #作成プロセス通信キュー 8 Q = multiprocessing.Queue() 。9つの #は、サブプロセスを作成する 10 P = multiprocessing.Process(目標= F、引数の= (Q)) 。11 #のプロモータープロセス 12は p.start() 13で 印刷(' データ処理を取得する(%Sは)開始... '%のmultiprocessing.current_process()。PID) 14の #は、データをフェッチ 15 プリント(q.get()) #パイソン 16 p.join ()
上記の手順は、最初の5行(サブプロセス)は、キューデータに責任があり、コードの第15行(親プロセス)は、キューからデータを読み出すための責任を負います
これは父、二つのプロセスの子との間の通信を可能にします。
パイプは、プロセス間通信を使用して達成しました
パイプは、通信のプロセスを用いて達成、プログラムは、パイプラインを作成するmultiprocessing.Pipe()関数を呼び出し、関数が通信を接続するための2つのPipeConnectionオブジェクト、パイプ(それぞれ2つの端部に接続されたパイプ、の二つの接続端部の代表を返します二つのプロセス)。
PipeConnectionオブジェクトは、次の通常の方法が含まれています。
1.sendは(OBJ):パイプの他端及び受信の他端のrecv()メソッドに送らOBJ。なお、objがpickle化可能な(Pythonのシリアル化機構)である必要があり、
32メガバイト以上に、そのオブジェクトが直列化されている場合とValueError例外の後につながる可能性があります。
2.recv():送信()端によって他から送られてくるデータを受信する方法。
3.fileno():ファイルディスクリプタは、接続に使用されています。
4.close():接続を閉じます。
5.poll([タイムアウト]):接続データを読み取ることができるが存在するかどうかを返し。
6.send_bytes(緩衝液[[オフセット、サイズ]):データバイトを送信します。オフセットがない場合は、サイズ・パラメータ、デフォルトのバッファの全てのデータは、バイトシーケンスを送信しない、オフセットおよびサイズのパラメータが指定された場合、送信バッファからのバイトの文字列のみが、データサイズのバイト単位の長さを相殺します。データを送信する方法は、recv_bytes()メソッドまたはrecv_bytes_intoを使用して受信されなければなりません。
7.recv_bytes([MAXLENGTH]):データのsend_bytesによって受信()メソッドが送信ディエゴ、MAXLENGTHはバイトの最大数は、受信指定します。この方法は、受信されたデータのバイト数を返します。
8.recv_bytes_into([、オフセット]緩衝液):ことを除いて機能recv_bytes()同様の方法、バッファ内の受信データの方法。
2つのプロセス間の通信を可能にするためにパイプを使用します。
1つの インポートマルチプロセッシング 2 DEF F(CONN)を: 3 プリント(' (%S)プロセスは、データの送信を開始... '%のmultiprocessing.current_process()PID) 4。 #送信データCONNを使用して 5。 conn.send(' パイソン' ) 6 IF __name__ == ' __main__ ' : 7つの #はパイプを作成し、関数は、2つのオブジェクトPipeConnectionを返す 8。 parent_conn、child_conn = multiprocessing.Pipe() 9つの。 #は、サブプロセスの作成 10 multiprocessing.Process = P(目標= F、引数の= (child_conn)) 。11 #のプロモーター工程 12で p.start() 13は プリント(' 率(%S)プロセスはデータの受信を開始... '%のmultiprocessing.current_process() .pid) 14 #読み出しデータによってconnの 15 プリント(parent_conn.recv()) #パイソン 16 p.joinを()
上記手順コード(サブプロセス)のライン6がPipeConnection介してダクトにデータを送信し、データが親パイプの他端に送信されます。
PipeConnectionによるパイプからデータを読み取るためのコード(親プロセス)の最初の16行は、プログラムは、このように親、二つのサブプロセス間の通信を達成する、プロセスの他の端末に書き込まれたデータを読み出すことができます。