我之前已经做过一些多进程的工作,但这次我无法想出解决方法。
我知道只有在模块的顶层定义的函数才能被pickle。到目前为止这一直很好用,但现在我必须在一个实例中使用共享内存,我不知道如何将函数移动到顶层。
考虑以下情况
import numpy as np
import multiprocessing
from itertools import repeat
class Test:
def __init__(self, x, y):
self.x = x
self.y = y
def my_task(self):
# Create process pool
p = multiprocessing.Pool(4)
# Create shared memory arrays
share1 = multiprocessing.Array("d", self.x, lock=False)
share2 = multiprocessing.Array("d", self.y, lock=False)
def mp(xc, yc, c):
# This is just some random weird statement
foo = np.sum(share1) + np.sum(share2) +xc + yc + c
return foo
def mp_star(args):
return mp(*args)
# Define some input for multiprocessing
xs = [1,2,3,4,5]
ys = [5,6,7,8,9]
c = 10
# Submit tasks
result = p.map(mp_star, zip(xs, ys, repeat(c)))
# Close pool
p.close()
return result
# Get some input data
x = np.arange(10)
y = x**2
# Run the thing
cl = Test(x=x, y=y)
cl.my_task()
你可以看到,我需要从实例中访问共享数据。出于这个原因,我把多进程部分放在'my_task'方法内。由于这个原因,我会得到典型的pickle错误。
_pickle.PicklingError: Can't pickle <function Test.my_task.<locals>.mp_star at 0x10224a400>: attribute lookup mp_star on __main__ failed
我已经知道了其中的内容。但是我不能将多进程任务移动到顶层,因为我需要访问共享数据。此外,我希望保持依赖项的数量较低,因此需要使用内置的多进程库。
希望代码有意义。那么,如何在多进程实例中使用共享内存空间?是否有一种方法可以将函数移动到顶层?