繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM