嗯,他们不应该崩溃,但无论如何他们都会这样做。有没有办法让多处理.Pool或任何其他多处理工具重新启动一个死的进程?我怎么会这样做呢?
谢谢!
编辑:一些背景知识。该过程使用Autodesk Maya中的几何体执行多项操作。它完全没问题。问题是每隔一段时间我会有一个文件决定,一旦它完成并打开一个新场景,完全退出Maya(或mayapy)没有python警告或错误,或来自Windows的关键进程错误。它就死了。不幸的是,我无法做任何关于崩溃的事情。
我希望能够重新启动任何因崩溃而死亡的进程。
答案 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