Python多处理.池来加速类中不返回的方法



我有一个类,在我的研究中我用它来处理一堆有趣的信号簇。我发现需要很长时间来处理的方法,将有必要采取更快速的计算方式,因为集群的数量将增加。

按照我的方法计算信号中的贡献。for Etruth in setEclusters:行以前以串行模式使用,现在注释为以并行模式运行:

class cluster_mxn:
def ComputeXTmultiCore(self, idx):
## Compute the XT inductive and capacitive to build a relative contributions on each cell on the cluster
XTc, XTl, Noise, clusSampXT_C, clusSampXT_L, clusSampNoise, clusSampCell = [], [], [], [], [], [], []
nSamp = 4        
setEclusters = self.clusEtruth

#for Etruth in setEclusters: ## approach before change to parallel mode
Etruth = setEclusters[idx]
i, j      = np.shape(Etruth)
g_tau_0   = genTau_0(nSamp*i*j)
vectDelay = genSampDelay(nSamp*i*j)
clusCellSamp, clusXTcSamp, clusXTlSamp  = genCellSamples(vectDelay, g_tau_0), genXTcSamples(vectDelay, g_tau_0), genXTlSamples(vectDelay, g_tau_0)
clusNoise = genNoise(i*j, norm=True)
clusNoise = clusNoise.reshape(Etruth.shape)
XTc_Cluster, XTl_Cluster = self.RelativeClusters(Etruth)
XTc.append(XTc_Cluster), XTl.append(XTl_Cluster), Noise.append(clusNoise)

self.clusXT_C  = XTc
self.clusXT_L  = XTl
self.clusNoise = Noise

这里,我是怎么调用的:

idx = clus2_zee.SetClusterSize()
if __name__ == '__main__':
with Pool(4) as pool:        
pool.map((clus2_zee.ComputeXTmultiCore), range(len(idx)) )
pool.close()
pool.join() 

代码以并行模式运行,但在每次迭代中不附加变量XTc, XTl和Noise,并且在self.xxx中不共享结果。

我如何正确地指示每个进程应该存储结果以在处理后在类中共享的变量?

多处理不是灵丹妙药。它生成解释器的新副本,这些副本是隔离的,除了multiprocessing提供的通信原语(以及您可能构建的任何其他原语)。特别是他们不能打对方的阳具。所以你需要做沟通明确,通过返回一个值(或推到一个队列)或通过设置共享muteable状态。正如文档所指出的,您几乎总是不希望共享状态。在这种情况下,我没有理由不返回您需要的变量,并在稍后对其进行排序。这样做也会更快,因为您不需要锁和相关的等待。

详情请参阅文档

最新更新