MultiProcessing モジュールは、同時実行を処理するパッケージに似た優れたマルチスレッド MultiThreading モジュールです。
私は以前にこのライブラリに少し触れたことがありますが、今回は退屈だったので詳しく勉強していませんでした。私の疑問を解決してください。
今日は、apply_async メソッドと map メソッドを学習しましょう。噂によると、これら 2 つの方法はプロセス プール内のプロセスを関連する関数に割り当てます。それを確認したいと思います。
これら 2 つの公式 Web サイトの説明を見てください:
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
結果オブジェクトを返す apply() メソッドのバリアント。 callback が指定されている場合、それは単一の引数を受け入れる呼び出し可能である必要があります。結果が準備完了になると、コールバックが適用されます。つまり、呼び出しが失敗した場合は、代わりに error_callback が適用されます。
error_callback が指定されている場合は、それが適用されます。単一の引数を受け入れる呼び出し可能関数である必要があります。ターゲット関数が失敗した場合、error_callback が例外インスタンスで呼び出されます。そうしないと、結果を処理するスレッドがブロックされるため、コールバックはすぐに完了する必要があります。
map(func) , iterable[, chunksize])map() 組み込み関数と同等の並列関数 (ただし、反復可能な引数は 1 つだけサポートします)。結果が準備できるまでブロックされます。
このメソッドは、反復可能オブジェクトを多数のチャンクに分割します。個別のタスクとしてプロセス プールに送信されます。これらのチャンクの (おおよその) サイズは、chunksize を正の整数に設定することで指定できます。
プールは、新しいリクエストが送信されたときにユーザーが呼び出す指定された数のプロセスを提供できます。プールがまだいっぱいでない場合は、リクエストを実行するために新しいプロセスが作成されますが、プール内のプロセスの数が指定された最大値に達した場合、リクエストはプール内のプロセスが終了するまで待機します。それを実行するための新しいプロセス
プログラムを見てみましょう:
from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid())) time.sleep(3)print("end")if __name__ == '__main__': pool = Pool(4)for i in range(4): msg = 'hello %d' % (i) pool.apply_async(func, (msg, ))# pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~") pool.close() pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")
実行結果:
マップのコメントを削除し、apply_async 関数にコメントを追加します プロセスを見てくださいプールプロセスが足りない場合のプログラムと実行結果:from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid())) time.sleep(3)print("end")if __name__ == '__main__': pool = Pool(3)'''for i in range(4): msg = 'hello %d' % (i) pool.apply_async(func, (msg, ))'''pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~") pool.close() pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")
プログラム結果:
ご覧のとおり、プロセスプール内のプロセス数が、関数を実行する必要がある場合、結果は正常に実行されますが、プロセス プール内のプロセスの数が実行される関数の数より少ない場合、1 つのプロセスがブロックされます。つまり、2 つ以上の関数が 1 つのプロセスを共有します。さらに、apply_async 関数の 2 番目のパラメーターが実行されると、その関数にプロセスが割り当てられることに注意してください。複数のプロセスを割り当てる必要がある場合は、for ループまたは while ループが必要です。map 関数は 2 番目のパラメーター値としてイテレーターを受け取るため、for ループを使用する必要はありません。これら 2 つの関数が実装するのは、プロセス プール内のプロセスを順番に関数に割り当てることであることに注意してください。
ちなみに、MultiProcessing の公式 Web サイトはすべて英語で非常にわかりにくく、読むのが苦痛ですが、英語にとっては非常に役立つと言わざるを得ません...。
以上がPython の MultiProcessing ライブラリの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。