如何使用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)

或类似。

08-05 16:56