1

我正在尝试使用该multiprocessing模块在池中并行化一个函数,但我遇到了错误:

守护进程不允许有子进程

更具体地说,我正在使用使用模块进行并行emcee化的multiprocessing模块,并且我想并行化我的后验函数以加快计算速度。在这种情况下,有没有办法在 main 中并行化一个函数Pool

编辑(添加代码)

# defines the log-posterior probability distribution
def logp(p):

    mu_imf, mu_h0, sigma_h, b_h = p
    
    logpost = np.zeros(ngal, dtype='longdouble')
    
    for i in range(ngal):
        logpost[i] = np.log(quad(lambda m_halo: Integrand(m_halo, i, mu_imf, mu_h0, sigma_h, b_h), 11.9, 15.0107)[0])
        
    return np.sum(logpost) 

with Pool() as pool:
    sampler = emcee.EnsembleSampler(nwalkers, npars, logp, pool=pool)
4

1 回答 1

2

一般来说,您不想这样做。并行化并行进程会很快爆发。它也可能不会快多少,因为启动新流程会产生开销。

与其尝试一次并行化所有内容,不如分两步并行化。首先生成您感兴趣的所有 emcee 任务,并并行化您的处理,如docs中所示。然后将您的结果聚合到一个队列中,并将您的后验函数映射到该队列

即,与其使用当前设置,不如将其并行化:

def do_work(**params):
    some_results = do_emcee_call_in_parallel(**params)
    do_stuff_with_some_results(some_results)

如果您将问题分成两部分,请执行以下操作:

problems = get_all_problems()
results = parallel_solve_emcee_problems(problems)
pool = Pool()
pool.map(posterior, results) # etc

或者,如果我误解了您想要做什么,请随时展示您想要的输入和输出是什么。

于 2021-09-20T13:27:40.340 回答