教えてください
解決したいこと
下記の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です。