繁体   English   中英

如何使许多perallel流程对单个共享NumPy数组进行更改?

[英]How can I make many perallel processes make changes to a single shared NumPy array?

我在互联网上搜寻答案,但找不到任何适合我的情况。 我读过有关multiprocessing.Manager ,尝试过来回传递东西,但似乎都无法与NumPy数组一起使用。我尝试使用Pool代替,但是我的目标方法没有返回任何东西,它只是对数组,所以我不确定如何设置它。

现在我有:

def Multiprocess(self, sigmaI, sigmaX):
    cpus = mp.cpu_count()
    print('Number of cpu\'s to process WM: %d' % cpus)

    processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

目标函数CreateMatrixMp接受传递的值,并在进行计算后将值附加到数组data 此数组声明为self.data = numpy.zeros(self.size, numpy.float64) 如果CreateMatrixMp方法的详细信息有帮助,我也可以发布它。

我尝试在运行过程的上方添加以下内容:

mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)

然后将sharedData传递到CreateMatrixMp ,在这里可以对其进行修改。 一旦所有进程都运行并且数组完成,我就简单地执行self.data = sharedData

但这是行不通的(尽管我知道我没有正确设置它)。 如何使用NumPy数组完成此操作? 我希望每个进程(将有成千上万个)附加到同一数组。

任何帮助深表感谢。

欢迎来到多线程的黑暗世界。 我认为您的最大问题是mgr.Array围绕数组进行同步。 如果您快速生成数据,这将成为瓶颈,因为进程将等待最后一个数组完成。 如果每个进程都保留该nump数组的私有副本,它将更加高效,并且将有所帮助。 输入所有数据后,请等待所有过程完成。 然后,您可以将所有数组组合到self.data中。 这样,所有已处理的资源都无需等待共享资源。 此解决方案或您的解决方案都不能保证输出列表的顺序。 我从self.numPixels怀疑顺序可能很重要。 解决方案很多,但最简单的方法是按顺序输入数据并在完成后执行self.data.sort(...)。 另一种方法是,更快地预先创建self.data并使进程在正确的位置戳结果。 self.data不必是共享的数据结构,因为进程永远不会改变任何共同点。 如果数组映射到类似C的数组,这将起作用。 它不适用于链接列表等。希望这会有所帮助。 询问是否需要更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM