如何使用python的多处理池处理KeyboardInterrupt事件?这是一个简单的示例:
from multiprocessing import Pool
from time import sleep
from sys import exit
def slowly_square(i):
sleep(1)
return i*i
def go():
pool = Pool(8)
try:
results = pool.map(slowly_square, range(40))
except KeyboardInterrupt:
# **** THIS PART NEVER EXECUTES. ****
pool.terminate()
print "You cancelled the program!"
sys.exit(1)
print "\nFinally, here are the results: ", results
if __name__ == "__main__":
go()
当运行上面的代码时,按
KeyboardInterrupt
会引发^C
,但是该过程只是在此时挂起,因此我必须在外部将其杀死。我希望能够随时按
^C
并导致所有进程正常退出。 最佳答案
这是一个Python错误。等待threading.Condition.wait()中的条件时,从不发送KeyboardInterrupt。复制:
import threading
cond = threading.Condition(threading.Lock())
cond.acquire()
cond.wait(None)
print "done"
直到wait()返回时,才会传递KeyboardInterrupt异常,并且它永远不会返回,因此中断永远不会发生。 KeyboardInterrupt几乎可以肯定会中断条件等待。
请注意,如果指定了超时,则不会发生这种情况; cond.wait(1)将立即收到中断。因此,一种解决方法是指定超时。为此,请更换
results = pool.map(slowly_square, range(40))
和
results = pool.map_async(slowly_square, range(40)).get(9999999)
或类似。