通常のPythonマルチプロセスでは、親プロセスが子プロセスに配布タスク、子プロセスの成功のための唯一の責任があり、親プロセスは気にしません。
しかし、本番環境では、これは明らかに不適切である。私は、キューでマークされた子プロセスの障害は、あなたが失敗したプロセスを再試行達成できるコールバックメソッドを介して取得することができ、子供の研究状況で見つかった、コード次のように:
インポートキュー のインポートランダム 読み込み時間 からマルチプロセッシングインポートプール Q = Queue.Queue() SUCCESS_COUNT = 0 #実際の操作方法タスク DEFの:long_time_task(TABLE_NAME) RD(1、10 = random.randint )
#タスクがスロー失敗し、投げをタスク名は、コールバックメソッドであるキャプチャすることができる IF RD%2 == 0: 昇給の例外(TABLE_NAME) グローバルQの 印刷(' OK = S%'%table_nameの) time.sleep( 1。 ) #ミッション成功回数 DEF 成功(SUC): グローバルSUCCESS_COUNT SUCCESS_COUNT。= SUCCESS_COUNTは1つの+ #キャプチャは、タスクを失敗したDEF ERR(エラー): q.put(エラー)IF __name__ == ' __main__ ' : #はスレッドプールに初期化する4つのスロット P =プール(4 ) リスト [= ' table_ ' + STR(I)のために I における範囲(1、21である。)] lists_num = LEN(リスト) キュー位タスク 用 I にリスト: q.put(I)
#キューが動作中のタスクがあってもよい、必ずしもすべてのタスクが完了していない空で、ループを終了するために、2つの条件を満足する必要がある 一方で ない q.empty()または SUCCESS_COUNT =!Lists_num: IF q.empty(): time.sleep( 1。 ) それ以外: p.apply_async(long_time_task、引数 =(q.get()、)、コールバック=成功、error_callback = ERR) p.close() p.join() 印刷(" q.size = Dの%D%= SUCCESS_COUNT '%(q.qsize()、SUCCESS_COUNT))