在Python中终止无响应的进程 - 多处理

时间:2016-08-04 23:45:51

标签: python python-multiprocessing

如果给定超时的活动状态保持为TRUE,是否有一种简单的方法可以使进程终止?

我正在使用Python多处理模块在多个核心中启动进程。有时这些进程没有成功,在没有做任何事情的情况下卡住了,但是处于活动状态(is_alive()= TRUE)。

jobs    = []                                # this list will contain all jobs

for i in studies:                           # we will call as many processes as elements in studies     
    arguments = (i)                         # my arguments
    p = multiprocessing.Process(target = myprocess, args = arguments)  
    jobs.append(p)                          # list of jobs
    p.start()                               # start process

我正在寻找用p.start()代替的东西:

    p.start_with_timeout(t=mytime)

谢谢!

1 个答案:

答案 0 :(得分:-1)

我设法通过以下方式解决了我的问题:

最初我开展研究。每项研究都是一个单独的过程。我的问题是我希望这些进程在一定的超时后自行“死”。我不能为每个进程执行p.join(timeout)跟随y p.terminate(),因为它会进入主循环并延迟新进程的启动,直到前一个进程不活动。

解决方案是引入一个层次结构,其中p.start()不会直接启动我感兴趣的进程('myprocess'),而是另一个负责查杀的进程。我把它叫做'dordie':

jobs    = []                                # this list will contain all jobs

for i in studies:                           # we will call as many processes as elements in studies     
    arguments = (i)                         # my arguments
    p = multiprocessing.Process(target = dordie, args = arguments)  
    jobs.append(p)                          # list of jobs
    p.start()                               # start process

'dordie'负责启动每个'myprocess'并在上面的'for'循环之外杀死每个'myprocess',这确保无论启动多少个进程,它们都会更早地死掉比在其中硬编码的超时,但同时,没有什么能阻止更多的进程被启动。

def dordie(i):

    arguments = (i)
    timeout   = 600

    p = multiprocessing.Process(target=myprocess, args=arguments)
    p.start()
    p.join(timeout)
    if p.is_alive():
        p.terminate()

我不是程序员,所以也许这不是一个优雅的解决方案,尽管它的工作就像一个奇迹!无论如何,谢谢您的建议。