Poolによるマルチプロセス並列化
1920 ワード
Multiprocessingモジュールはプラットフォームバージョンにまたがるマルチプロセスモジュールであり、スレッドのようにプロセスを管理し、threadingとよく似ており、マルチコアCPUの利用率はthreadingよりずっと良い.Poolクラスでは、ユーザーが呼び出すために指定された数のプロセスを提供できます.新しいリクエストがPoolにコミットされると、プールが満たされていない場合、リクエストを実行するための新しいプロセスが作成されます.プールがいっぱいになると、リクエストは、プールにプロセスが終了するまで待機するように通知され、これらのリクエストを実行するために新しいプロセスが作成されます.
関数プロトタイプ:apply(func[,args=()[,kwds={}]])は、pythonのapply関数と一致する不定パラメータを伝達するために使用され、主プロセスは関数の実行が終了するまでブロックされます(使用は推奨されず、3.x以降は表示されません).
2、apply_async()
関数プロトタイプ:apply_async(func[, args=()[, kwds={}[, callback=None]]]).applyの使用法と一致しますが、ブロックされておらず、サポート結果が返された後にコールバックされます.
3、map()
関数プロトタイプ:map(func,iterable[,chunksize=None])、Poolクラスのmapメソッドは、組み込まれたmap関数の使用方法とほぼ一致し、結果が戻るまでプロセスをブロックします.
4、map_async()
関数プロトタイプ:map_async(func, iterable[, chunksize[, callback]]). mapの使い方と一致しますが、ブロックされていません.その関連事項はapply_を参照してください.async.
5、close()プロセスプール(pool)を閉じ、新しいタスクを受け入れないようにします.
6、terminal()は作業プロセスを終了し、未処理のタスクを処理しない.
7、join()メインプロセスブロックはサブプロセスの終了を待つ.joinメソッドはcloseまたはterminateの後に使用する.
import os
from multiprocessing import Pool
def process_multi(targetDir, resultDir):
files = os.listdir(targetDir)
pool = Pool(processes=10)
for fileName in files:
if not fileName.startswith('x'):
continue
targetFile = os.path.join(targetDir, fileName)
resultFile = os.path.join(resultDir, fileName)
pool.apply_async(process, (targetFile, resultFile))
pool.close()
pool.join()
コメント
1、ブロックと非ブロックの違い:
注意:join()関数が後で呼び出された場合、mapまたはmap_が以前に使用されていたかにかかわらずasyncでは、メインプロセスがプロセスプール内のすべてのプロセスが実行されるまで待機します.