使用多进程附加到实例列表
append to instance list with multiprocess
我有一个 class,其中有一个属性列表。在实例化 class 之后,我想进行一些计算,然后将结果(本身就是列表)附加到列表中。我正在尝试使用 multiprocess
来加速 calculations/appending 因为顺序无关紧要。以下是一个简化的例子:
import multiprocessing as mp
class Test(object):
def __init__(self):
self.basis = []
def action(self, i):
self.basis.append([i])
def test(self):
for i in xrange(5):
self.action(i)
print(self.basis)
def test_mp(self):
jobs = []
for i in xrange(5):
job = mp.Process(target=self.action, args=(i,))
jobs.append(job)
job.start()
for j in jobs:
j.join()
print(self.basis)
Test().test()
# Returns correct list
Test().test_mp()
# Returns empty (incorrect) list
我的方法似乎只适用于不尝试并行 运行(适用于 test
,但不适用于 test_mp
)。我很确定 test_mp
没有工作,因为每个进程都没有共享它自己的 self.basis
版本,但我不确定如何克服这个问题。我研究过将 self.basis
设为 mp.Array
,但由于我试图附加列表而不仅仅是数字,所以失败了。我发现了其他几个类似的问题,但是当尝试在 class 中使用他们的解决方案时,他们的答案似乎会崩溃(酸洗错误等)
你可以使用 Manager
import multiprocessing as mp
class Test(object):
def __init__(self):
self.basis = mp.Manager().list()
输出:
[[0], [3], [1], [4], [2]]
我有一个 class,其中有一个属性列表。在实例化 class 之后,我想进行一些计算,然后将结果(本身就是列表)附加到列表中。我正在尝试使用 multiprocess
来加速 calculations/appending 因为顺序无关紧要。以下是一个简化的例子:
import multiprocessing as mp
class Test(object):
def __init__(self):
self.basis = []
def action(self, i):
self.basis.append([i])
def test(self):
for i in xrange(5):
self.action(i)
print(self.basis)
def test_mp(self):
jobs = []
for i in xrange(5):
job = mp.Process(target=self.action, args=(i,))
jobs.append(job)
job.start()
for j in jobs:
j.join()
print(self.basis)
Test().test()
# Returns correct list
Test().test_mp()
# Returns empty (incorrect) list
我的方法似乎只适用于不尝试并行 运行(适用于 test
,但不适用于 test_mp
)。我很确定 test_mp
没有工作,因为每个进程都没有共享它自己的 self.basis
版本,但我不确定如何克服这个问题。我研究过将 self.basis
设为 mp.Array
,但由于我试图附加列表而不仅仅是数字,所以失败了。我发现了其他几个类似的问题,但是当尝试在 class 中使用他们的解决方案时,他们的答案似乎会崩溃(酸洗错误等)
你可以使用 Manager
import multiprocessing as mp
class Test(object):
def __init__(self):
self.basis = mp.Manager().list()
输出:
[[0], [3], [1], [4], [2]]