2016-08-08 16 views
5

私は、各プロセスがリストの一部を処理するように、プロセスまたはスレッド間で分割したいイメージパスのリストを持っています。処理には、ディスクからイメージをロードし、計算を実行して結果を返す処理が含まれます。私はここでmultiprocessing.PoolPythonマルチプロセッシングプールとマルチプロセッシングThreadPool

私は労働者が、私は私の初期化子機能で初期化時間を記録するとき、私は」労働者が上がらないことを知っているようになったことを

def ProcessParallel(classifier,path): 
    files=glob.glob(path+"\*.png") 
    files_sorted=sorted(files,key=lambda file_name:int(file_name.split('--')[1])) 
    p = multiprocessing.Pool(processes=4,initializer=Initializer,initargs=(classifier,)) 
    data=p.map(LoadAndClassify, files_sorted) 
    return data 

私はそれに直面しています問題を処理して作成する方法を説明しますのPython 2.7を使用しています並行して初期化さtは、むしろ各ワーカーは、5秒の間隔で初期化され、ここで同時に労働者を開始私は代わりmultiprocessing.pool.ThreadPoolを使用して試した参照

2016-08-08 12:38:32,043 - custom_logging - INFO - Worker started 
2016-08-08 12:38:37,647 - custom_logging - INFO - Worker started 
2016-08-08 12:38:43,187 - custom_logging - INFO - Worker started 
2016-08-08 12:38:48,634 - custom_logging - INFO - Worker started 

のログです。
私はWindows上でのマルチプロセッシングの仕組みを知っており、無限のプロセスを生成することからコードを保護するためにmain guardを配置する必要があります。私の場合の問題は、FASTCGIを使用してIIS上でスクリプトをホストしていて、スクリプトがメインではなく、FastCGIプロセスによって実行されていることです(それを担当するwfastcgi.pyスクリプトがあります)。現在、wfastcgi.pyの内部にメインガードがあり、ログにはプロセスが無限に作成されていないことが示されています。

今、私は同時にワーカースレッドを作成しない マルチプロセッシング・プールの背後にある理由はまさに、私は 本当に任意の助けを感謝しますことを知ってほしいです。

EDIT 1:ここに私の初期化関数が

def Initializer(classifier): 
    global indexing_classifier 
    logger.info('Worker started') 
    indexing_classifier=classifier 
+0

「Initializer」とは何ですか? –

+0

作業者が起動する時刻を記録し、各作業者に 'classifier'という変数を渡す – Ahmed

+0

@MuhammadTahir編集した質問をご覧ください – Ahmed

答えて

0

私はCGI/WSGIの下でマルチプロセッシングを実行しようとしている多くの問題を持っていた、それはローカルで正常に動作ではなく、本当のウェブサーバ上の...結局それだけでISN互換性はありません。マルチプロセッシングが必要な場合は、非同期ジョブをCeleryのようなものに送ります。

関連する問題