使用多处理的程序大部分时间都花在线程锁上?

Nim*_*z14 7 python python-multiprocessing

我正在使用multiprocessing.Pool并行化我正在运行的程序的某些部分。我正在循环数据,计算一些内容,然后返回结果。

性能不佳的代码:

def likelihood_data(self, data):
    func = partial(likelihood, means=self.means, stddevs=self.stddevs, c_ks=self.c_k)
    if len(data) > 100:
        pool = Pool(10)
        try:
            likelihoods = pool.map(func, data)
        finally:
            pool.close()
            pool.join()
    else:
        likelihoods = []
        for sample in data:
            likelihoods.append(self.likelihood(sample))
    return np.mean(likelihoods)

def likelihood(sample, means, stddevs, c_ks):  # is outside of class
    likel = [] 
    for c_k, m, s in zip(c_ks, means, stddevs):
        likel.append(likel_bound(np.log(c_k) + np.sum(logg(sample, m, s))))
    return np.sum(np.exp(likel))   
Run Code Online (Sandbox Code Playgroud)

从使用 cProfile 来看,性能不佳是因为大部分时间都花在了{method 'acquire' of '_thread.lock' objects}. 我不明白为什么当每个进程彼此独立时会发生这种情况。这里发生了什么?

编辑:或者它只是花费了最长的时间,因为它正在等待所有进程完成?

Nim*_*z14 3

我的错误是我对太少的数据使用了多重处理。likelihood_data正如我多次调用的那样,所有时间都花在启动和停止多处理上,而没有任何实际收益。