使用多进程的程序大部分时间都花在线程锁上?
Program using multiprocessing spends most of its time on thread lock?
我正在使用 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))
使用 cProfile 时,性能不佳是因为大部分时间花在 {method 'acquire' of '_thread.lock' objects}
上。我不明白为什么当每个进程彼此独立时会发生这种情况。这里发生了什么?
编辑:还是它花费的时间最长,因为它正在等待所有进程完成?
我的错误是我对太少的数据使用了多重处理。当我多次调用 likelihood_data
时,所有时间都花在了启动和停止多处理上,而没有任何实际收益。
我正在使用 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))
使用 cProfile 时,性能不佳是因为大部分时间花在 {method 'acquire' of '_thread.lock' objects}
上。我不明白为什么当每个进程彼此独立时会发生这种情况。这里发生了什么?
编辑:还是它花费的时间最长,因为它正在等待所有进程完成?
我的错误是我对太少的数据使用了多重处理。当我多次调用 likelihood_data
时,所有时间都花在了启动和停止多处理上,而没有任何实际收益。