Poolによるマルチプロセス並列化

1920 ワード

  • Poolモジュールはmultiprocessingモジュールから来ている.

  • Multiprocessingモジュールはプラットフォームバージョンにまたがるマルチプロセスモジュールであり、スレッドのようにプロセスを管理し、threadingとよく似ており、マルチコアCPUの利用率はthreadingよりずっと良い.Poolクラスでは、ユーザーが呼び出すために指定された数のプロセスを提供できます.新しいリクエストがPoolにコミットされると、プールが満たされていない場合、リクエストを実行するための新しいプロセスが作成されます.プールがいっぱいになると、リクエストは、プールにプロセスが終了するまで待機するように通知され、これらのリクエストを実行するために新しいプロセスが作成されます.
  • 関数
  • 1、apply()
    関数プロトタイプ: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の後に使用する.
  • code—view
  • 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、ブロックと非ブロックの違い:
  • map()はプロセスをブロックします.すなわち、map()で開かれたマルチプロセスが終了した後、この関数は結果を返します.そうしないと、メインプロセスはずっと待機し、下には進みません.
  • map_async()は非ブロック、すなわちmap_を介してasync()はマルチプロセスをオンにすると、すぐに結果を返し、メインプロセスは引き続き実行されます.

  • 注意:join()関数が後で呼び出された場合、mapまたはmap_が以前に使用されていたかにかかわらずasyncでは、メインプロセスがプロセスプール内のすべてのプロセスが実行されるまで待機します.