LoginSignup
10
10

More than 5 years have passed since last update.

PythonのmultiprocessingでPool.close()してもプロセスが一時停止中のまま残ってメモリがどんどん増える問題

Posted at

教えてください

解決したいこと

下記のmainに適当な引数を与えて実行すると、プロセスがどんどん増えてメモリが逼迫するので、これを防ぎたいです。

import multiprocessing

def score4abc(a,b):
  score = a,b
  return score

def wrapper_score4multi(args):
  return score4abc(*args)

def main(a,foo):
    for i in range(500):
        pool = multiprocessing.Pool(32)
        pool.map(wrapper_score4multi,[[a,b] for b in foo]#常に32個のプロセスがR状態となり、終了したプロセスはS状態のままとどまる
        pool.close()

こんなことができるといいなあ

平たく言うと、pool.kill()みたいなノリのメソッドで残ってるプロセスをkillできるとかなりよい感じがします。

補足情報

ps auxで調べたところ、下記のコードを実行中に並列処理しているプロセスが一時停止のままずっと残っていたので、それが原因なのではないかと思いました。
公式ドキュメントによると、Pool.terminate()で停止、Pool.close()で終了と書いてありますが、Pool.close()してもばっちり残っています。
詳細な事情は忘れましたが、並列処理したい関数に複数の引数を渡すためにはProcessは使えず、下記のようにpool.mapを利用しないと難しかったような気がします。
また、そのプロセスを特定してshellで1分ごとにkillしても、時間が経つとプロセスの数がすぐに元通りになります(ローレイヤすぎて自分では原因を特定できない)
上記は、Cythonでコンパイルして実行しています。
上記のmainの呼び出し元のpythonのバージョンは2.7.3です。

10
10
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10