【问题标题】:Termination of an unresponsive process in Python - multiprocessing [duplicate]在Python中终止无响应的进程-多处理[重复]
【发布时间】:2016-08-04 23:45:50
【问题描述】:

如果进程的存活状态在给定的超时时间内保持为真,是否有一种简单的方法可以终止进程?

我正在使用 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)

谢谢!

【问题讨论】:

    标签: python python-multiprocessing


    【解决方案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' 循环之外杀死它们,这样可以确保无论启动多少进程,它们总是会更早死亡而不是在其中硬编码的超时,但同时,没有什么能阻止启动更多进程。

    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()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2018-11-05
      • 1970-01-01
      • 2015-11-10
      • 2014-04-25
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多