[英]Python multiprocessing.Pool with processes that crash
好吧,他们不应该崩溃,但无论如何他们都会这样做。 有没有办法让多处理.Pool或任何其他多处理工具重新启动一个死的进程? 我怎么会这样做呢?
谢谢!
编辑 :一些背景。 该过程使用Autodesk Maya中的几何体执行多项操作。 它完全没问题。 问题是每隔一段时间我会有一个文件决定,一旦它完成并打开一个新场景,完全退出Maya(或mayapy)没有python警告或错误,或来自Windows的关键进程错误。 它就死了。 不幸的是,我无法做任何关于崩溃的事情。
我希望能够重新启动任何因崩溃而死亡的进程。
事实上,正如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块中进行,尽管我没有彻底测试过。
显然,最近他们改变了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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.