1

マルチプロセッシング機能の設定でエラーを見つけるのを手伝ってくれるかもしれません。データ (float 型) を取得して平均を計算するワーカー関数を設定しました。次のコードを (join() を使用して) 使用すると、マルチプロセッシングは開始されず、各 for ループが次々と処理されます。正しい値が計算されます。

反対に、join() 関数を削除すると、並列処理が有効になりますが、エラーが発生し、計算されたデータのほとんどが同じになります。ワーカー プロセスは独自のリストと変数を使用していないようです。ヒントを教えてください。ありがとうございました。ステファン

for hostgroup in hostgroups:
jobs = []
#multiprocessing.log_to_stderr(logging.DEBUG)
p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
jobs.append(p)
p.start()
p.join()

UPDATE、それはプールで動作していますが、まだ並列ではありません:

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=number_of_processes)
for hostgroup in hostgroups:
    result = pool.apply_async(worker, [hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name])
    print result.get(timeout=30)

更新、これは並行して動作するようですが、一部のプロセスのみが正しく終了します (常に異なります):

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool()
results = []
for hostgroup in hostgroups:
    results.append(pool.apply_async(worker,[hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name]))
pool.close()
pool.join()
4

1 に答える 1

2

p.join() は、プロセスが作業を完了するまでメイン スレッドをブロックします。真の並列性を得るには、join() を呼び出す前にすべてのジョブを開始する必要があります。

コード例

jobs = []
for hostgroup in hostgroups:
    p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
    jobs.append(p)
    p.start()
[p.join() for p in jobs]
于 2012-07-30T10:08:04.650 に答える