web-dev-qa-db-ja.com

Pythonマルチプロセッシング-プロセスが完了したときにメモリを解放する方法は?

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;
25
Vendetta

pool.close を使用してプールを閉じようとしましたが、プロセスが終了するのを pool.join で待機しました。これは、親プロセスが実行を継続し、子プロセスを待たずに ゾンビ

29
Anurag Uniyal

プールでmaxtasksperchild引数を設定してみてください。そうしないと、プロセスがプールによって何度も再利用されるため、メモリが解放されることはありません。設定すると、プロセスは終了し、その場所に新しいプロセスが作成されます。これにより、メモリが効果的にクリーンアップされます。

2.7の新機能だと思います: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

17
user1914881

おそらく、Poolオブジェクトでclose()を呼び出してからwait()を呼び出す必要があります。

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

join()ワーカープロセスが終了するのを待ちます。 join()を使用する前に、close()またはterminate()を呼び出す必要があります。

3