問題
pythonのmultiprocessing Poolを、普通に書いて、実行中にctrl+cすると、プロセスが終了せず止まったままになる。
pool.py
import time
from multiprocessing import Pool
def worker(arg):
print("process {}".format(arg))
time.sleep(2)
if __name__ == '__main__':
p = Pool(2)
p.map(worker, range(6))
p.close()
(上記のソースを実行中にCtrl+Cすると)
(略)
KeyboardInterrupt
(この状態で停止してしまう)
プロセスIDを指定してkillしても、ゾンビのようにpythonが復活してしまう。
なんとかCtrl+Cできれいに終了させたい。
原因
StackOverflowにまったく同じ悩みを抱えている方がいらっしゃった。
https://stackoverflow.com/questions/1408356/keyboard-interrupts-with-pythons-multiprocessing-pool
Poolの中で呼んでる処理にKeyboardInterruptの入力が伝達されず、wait関数がいつまでも待ち続けてしまうらしい。
解決方法
タイムアウトを設定してやるとOK。
p.map(worker, range(6))
を
p.map_async(worker, range(6)).get(9999999)
に置き変える。