在Python的多处理中硬杀死挂起的子进程

时间:2016-02-27 11:33:02

标签: python timeout multiprocessing kill pool

我有一个Python函数,它调用C函数的包装器(我无法更改)。大部分时间C功能都非常快,但是当它失败时,呼叫就会永远挂起。为了减轻这种影响,我使用multiprocessing暂停通话:

pool = multiprocessing.Pool(processes=4)
try:
    res = pool.apply_async(my_dangerous_cpp_function, args=(bunch, of, vars))
    return res.get(timeout=1.)
except multiprocessing.TimeoutError:
    terminate_pool(pool)
    pool = multiprocessing.Pool(processes=4)

当被调用的函数没有回应任何信号时,如何终止池?

如果我将terminate_pool(pool)替换为pool.terminate(),则对pool.terminate()的调用也会挂起。相反,我目前正在向所有子流程发送SIGKILL:

def terminate_pool(pool):
    for p in pool._pool:
        os.kill(p.pid, 9)
    pool.close()  # ok, doesn't hang
    #pool.join()  # not ok, hangs forever

这样,挂起的子进程停止吃掉100%的CPU,但是我无法调用pool.terminate()pool.join()(它们挂起),所以我只是将池对象放在后面并创建一个新的一。即使他们收到了SIGKILL,子进程仍然是开放的,所以我的Python进程数量永远不会停止增加......

有没有办法一劳永逸地消灭池及其所有子流程?

1 个答案:

答案 0 :(得分:1)

标准document.write('<i class="fa fa-check"></i>')不是为处理员工超时而设计的。

Pebble处理池确实支持超时任务。

multiprocessing.Pool