Python multiprocessing.Pool,其中包含崩溃的进程

时间:2011-09-06 23:11:28

标签: python multiprocessing

嗯,他们不应该崩溃,但无论如何他们都会这样做。有没有办法让多处理.Pool或任何其他多处理工具重新启动一个死的进程?我怎么会这样做呢?

谢谢!

编辑:一些背景知识。该过程使用Autodesk Maya中的几何体执行多项操作。它完全没问题。问题是每隔一段时间我会有一个文件决定,一旦它完成并打开一个新场景,完全退出Maya(或mayapy)没有python警告或错误,或来自Windows的关键进程错误。它就死了。不幸的是,我无法做任何关于崩溃的事情。

我希望能够重新启动任何因崩溃而死亡的进程。

2 个答案:

答案 0 :(得分:1)

事实上,正如masida所说,错误处理在python 3.3中更好。在这里,我检查了一个儿童过程无声地死亡的超时。

这种解决方法适用于python< 3.3和multiprocessing.pool,当然,管理自己的进程是一个不错的选择。

使用pool.map_async异步运行进程,然后可以检查作业是否完成以及它们需要多长时间。如果它们花费的时间太长(例如,当一个过程死亡但不会返回时) - >使用pool.terminate()终止所有池进程并重新开始。在代码中:

done = False                                   # not finished yet
while not(done):
     job_start = time.time()                   # start time
     Jobs = pool.map_async(args)               # asynchronous pool call  
     redo = False                              # no redo yet
     while not(Jobs.ready()):                  # while jobs are not finished
       if (time.time() - job_start) > maxWait: # check maximum time (user def.)
           pool.terminate()                    # kill old pool
           pool = multiprocessing.pool(args)       # create new pool
           redo = True                         # redo computation
           break                               # break loop, (not finished)
     if not(redo):                             # computation was successful
         result = Jobs.get()                   # get results 
         done = True                           # exit outer while

另一种选择是对pool.imap返回的迭代器使用超时,它可以作为参数提供给迭代器的'next'方法,next(timeout)。如果一个进程超过了超时,那么在主进程中引发multiprocessing.TimeoutError,并且上面解释的类似操作可以在except块中进行,尽管我没有对此进行彻底测试。

答案 1 :(得分:0)

显然,最近他们改变了Python 3.3中的行为,在这种情况下引发异常: http://hg.python.org/cpython/rev/6d6099f7fe89

导致此票证的缺陷是: http://bugs.python.org/issue9205

但是,如果您手动生成worker(我在使用多处理时通常会这样做),您可以尝试使用Process.is_alive()函数: http://docs.python.org/dev/library/multiprocessing#multiprocessing.Process.is_alive