当必须处理的进程数超过cpu的数目时,如何正确设置python多处理?

2024-04-20 01:20:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我的工作是分割图像。它通过评估每一对像素的位置和强度差异(或相似性)来实现。它将每个像素看作图上的一个节点,每个像素的相似度对应于其连接边的权重。因此,我需要构建一个大小为(imageHeight*imageWidth)^2的对称权重矩阵。你知道吗

结果证明,构建矩阵需要很长时间,所以我正在尝试实践它(如果这是一个词的话)。你知道吗

下面是有问题的代码片段:

def Multiprocess(self, sigmaI, sigmaX):
    cpus = mp.cpu_count()
    print('Number of cpu\'s to process WM: %d' % cpus)
    jobs = []
    i = 0
    for p in range(self.numPixels):
        for c in range(cpus):
            if i >= self.numPixels:
                break
            else:
                weightCalculation = mp.Process(name='weightCalc%d'%(i), target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,))
                jobs.append(weightCalculation)
                weightCalculation.start()
                i += 1

实际上,你唯一需要知道的是self.numPixels是图像中的像素数。sigmaXsigmaI是任意两个像素之间位置和强度的差异。你知道吗

该算法所做的是观察一个像素,像素i,然后循环遍历图像中的其他每个像素j,找出它们之间的相似性。所以它是在并发中执行numPixels^2操作。你知道吗

我希望我上面写的代码也能做同样的事情,但是一次只能做cpus个像素。现在应该有(numPixels^2)/cpus进程在并发运行,对吗?对于大的,甚至是小的图像,这将大大减少时间。你知道吗

但我说的对吗?我必须有某种循环,这种循环的数量超过了cpu的数量(即for p in range(self.numpixels))。所以在这种情况下,我是否有行for c in range(cpus)也很重要?如果它本身是while循环,它也会做同样的事情,因为一旦它分配了cpu个进程,它就会再次循环。你知道吗

我应该在for循环的末尾“等待”一些东西,并且只在一个进程完成之后才开始下一个进程吗?或者如果我让它保持原样,它会以某种方式让它们排队吗?但这又让我想知道是否需要在任何地方指定cpu计数。我想这是一个多处理python包如何工作的问题,但是我已经阅读了一些教程和所有文档,似乎遗漏了一些东西。你知道吗

感谢所有读过这篇文章的人:p,以及任何能帮上忙的人!你知道吗


Tags: in图像selffor进程range像素差异