gpt4 book ai didi

Python 多处理似乎几乎不可能在类内完成/使用任何类实例。它的预期用途是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:47 24 4
gpt4 key购买 nike

我有一个我正在尝试并行化的算法,因为串行运行时间非常长。但是,需要并行化的函数在一个类中。 multiprocessing.Pool 似乎是最好和最快的方法,但是有一个问题。它的目标函数不能是对象实例的函数。意思是这个;你用下面的方式声明一个Pool:

import multiprocessing as mp
cpus = mp.cpu_count()
poolCount = cpus*2
pool = mp.Pool(processes = poolCount, maxtasksperchild = 2)

然后实际使用它:

pool.map(self.TargetFunction, args)

但这会引发错误,因为对象实例无法被 pickle,因为 Pool 函数会将信息传递给它的所有子进程。但我必须使用self.TargetFunction

所以我有了一个想法,我会创建一个名为 parallel 的新 Python 文件,并简单地编写几个函数而不将它们放在一个类中,然后从我的原始类中调用这些函数(我想并行化其功能)

所以我尝试了这个:

import multiprocessing as mp

def MatrixHelper(args):
WM = args[0][0]
print(WM.CreateMatrixMp(*args))
return WM.CreateMatrixMp(*args)

def Start(sigmaI, sigmaX, numPixels, WM):

cpus = mp.cpu_count()
poolCount = cpus * 2
args = [(WM, sigmaI, sigmaX, i) for i in range(numPixels)]
print('Number of cpu\'s to process WM:%d'%cpus)

pool = mp.Pool(processes = poolCount, maxtasksperchild = 2)
tempData = pool.map(MatrixHelper, args)

return tempData

这些函数不是类的一部分,在 Poolmap 函数中使用 MatrixHelper 可以正常工作。但是我意识到这样做是没有出路的。需要并行化的函数 (CreateMatrixMp) 需要一个对象传递给它(它被声明为 def CreateMatrixMp(self, sigmaI, sigmaX, i))

因为它不是从其类中调用的,所以它没有得到传递给它的 self。为了解决这个问题,我将 Start 函数传递给调用对象本身。比如,我说 parallel.Start(sigmaI, sigmaX, self.numPixels, self)。对象 self 然后变成 WM 这样我就可以最终调用所需的函数作为 WM.CreateMatrixMp()

我确信这是一种非常草率的编码方式,但我只是想看看它是否可行。但是不,再次出现 pickling 错误,map 函数根本无法处理任何对象实例。

那么我的问题是,为什么要这样设计呢?它似乎毫无用处,它似乎在任何使用类的程序中都完全失效。

我尝试使用 Process 而不是 Pool,但这需要共享我最终写入的数组,这需要进程相互等待。如果我不希望它被共享,那么我让每个进程写自己的小数组,最后做一个大写。但是 两者 这导致运行时间比我连续执行此操作时慢! Python 内置的 multiprocessing 似乎毫无用处!

在我的 tagret 函数位于类中的情况下,有人可以给我一些指导,说明如何通过多处理实际节省时间吗?我已经阅读了此处的帖子,改为使用 pathos.multiprocessing,但我在 Windows 上,并且正在与多个具有不同设置的人一起处理这个项目。让每个人都尝试安装它会很不方便。

最佳答案

我在尝试在类中使用多处理时遇到了类似的问题。我能够通过在网上找到的相对简单的解决方法来解决它。基本上你在你的类之外使用一个函数来解包/解包你试图并行化的函数内的方法。这是我找到的两个解释如何操作的网站。

Website 1 (joblib example)

Website 2 (multiprocessing module example)

对于两者,我们的想法是做这样的事情:

rom multiprocessing import Pool
import time

def unwrap_self_f(arg, **kwarg):
return C.f(*arg, **kwarg)

class C:
def f(self, name):
print 'hello %s,'%name
time.sleep(5)
print 'nice to meet you.'

def run(self):
pool = Pool(processes=2)
names = ('frank', 'justin', 'osi', 'thomas')
pool.map(unwrap_self_f, zip([self]*len(names), names))

if __name__ == '__main__':
c = C()
c.run()

关于Python 多处理似乎几乎不可能在类内完成/使用任何类实例。它的预期用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com