如何在超时时终止多处理进程

时间:2018-10-25 16:13:11

标签: python multiprocessing

proc启动5秒钟后,使用proc.terminate()命令在此处终止多处理proc。我正在使用while proc.is_alive()循环来完成任务。我想知道是否还有另一种方法可以在超时时终止proc。

import time, multiprocessing

def process():
    while True:
        print '...sleeping %s' % time.time()
        time.sleep(1)

proc = multiprocessing.Process(target=process)
proc.start()

timeout = 5
start_time = time.time()
while proc.is_alive():
    if time.time() - start_time > timeout:
        print 'terminating proc on timeout'
        proc.terminate()
    time.sleep(1)

稍后编辑:此问题被标记为重复,指向另一篇讨论多处理的帖子。Process的terminatejoin方法。它没有讨论超时终止。

1 个答案:

答案 0 :(得分:1)

您可以将Process.join与它的timeout参数一起使用,以在指定时间内阻止调用线程(在您的示例中为父进程的MainThread)。 .join将等待最长timeout秒的可能的过程退出,此后它将解除阻止。这使您可以编写:

import time, multiprocessing


def process():
    while True:
        print('...sleeping %s' % time.time())
        time.sleep(1)


if __name__ == '__main__':

    proc = multiprocessing.Process(target=process)
    proc.start()
    proc.join(timeout=5)
    proc.terminate()

确保您的过程实际上适合以这种方式终止。这意味着它不应与其他进程共享资源(例如队列),因为当终止进程此时持有锁时,这将导致死锁。