pythonマルチプロセッシングライブラリを使用しているときに、奇妙な問題が発生しました。
私のコードは以下にスケッチされています:「シンボル、日付」タプルごとにプロセスを生成します。その後、結果を組み合わせます。
プロセスが「シンボル、日付」タプルの計算を完了したら、そのメモリを解放する必要があると思いますか?どうやらそうではありません。マシンで中断されているプロセスが数十個あります(プロセスプールのサイズを7に設定しましたが)¹。それらはCPUを消費せず、メモリを解放しません。
計算が完了した後、プロセスにメモリを解放させるにはどうすればよいですか?
ありがとう!
¹「一時停止」とは、psコマンドでのステータスが「S +」として表示されることを意味します
def do_one_symbol( symbol, all_date_strings ):
pool = Pool(processes=7)
results = [];
for date in all_date_strings:
res = pool.apply_async(work, [symbol, date])
results.append(res);
gg = mm = ss = 0;
for res in results:
g, m, s = res.get()
gg += g;
mm += m;
ss += s;
pool.close
を使用してプールを閉じようとしましたが、プロセスが終了するのを pool.join
で待機しました。これは、親プロセスが実行を継続し、子プロセスを待たずに ゾンビ
プールでmaxtasksperchild引数を設定してみてください。そうしないと、プロセスがプールによって何度も再利用されるため、メモリが解放されることはありません。設定すると、プロセスは終了し、その場所に新しいプロセスが作成されます。これにより、メモリが効果的にクリーンアップされます。
2.7の新機能だと思います: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool
おそらく、Pool
オブジェクトでclose()
を呼び出してからwait()
を呼び出す必要があります。
http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool
join()
ワーカープロセスが終了するのを待ちます。 join()を使用する前に、close()またはterminate()を呼び出す必要があります。