multiprocessing.Pool挂起,如果孩子导致分段错误

Pet*_*fer 14 python numpy multiprocessing scikit-learn

我想使用multiprocessing.Pool并行应用函数.问题是如果一个函数调用触发了分段错误,则Pool会永久挂起.有没有人知道我如何制作一个可以检测到这种情况发生的池并引发错误?

以下示例显示了如何重现它(需要scikit-learn> 0.14)

import numpy as np
from sklearn.ensemble import gradient_boosting
import time

from multiprocessing import Pool

class Bad(object):
    tree_ = None


def fit_one(i):
    if i == 3:
        # this will segfault                                                    
        bad = np.array([[Bad()] * 2], dtype=np.object)
        gradient_boosting.predict_stages(bad,
                                         np.random.rand(20, 2).astype(np.float32),
                                         1.0, np.random.rand(20, 2))
    else:
        time.sleep(1)
    return i


pool = Pool(2)
out = pool.imap_unordered(fit_one, range(10))
# we will never see 3
for o in out:
    print o
Run Code Online (Sandbox Code Playgroud)

Are*_*ski 1

Pool().imap()也许您宁愿自己手动创建子进程,而不是使用Process(). 我打赌返回的对象可以让您获得任何孩子的活跃状态。他们是否挂断你就会知道。