如何正确初始化池工作者和运行方法

时间:2017-04-23 16:41:38

标签: python multiprocessing

背景

我正在努力让一群工人去解决任务。我的问题是我试图传递一个共享变量,但我收到一个错误。我为那些期望我的变量的工作者编写了一个初始化方法,但我似乎无法让它工作。

这是我的代码:

from matplotlib import pyplot
import time
import multiprocessing

#initialize some multiprocessing stuff
num_processes = 8
y = multiprocessing.Array('d', 1000, lock=False)
new_y = multiprocessing.Array('d', 1000, lock=False)
dt = multiprocessing.Value('d',0, lock=False)
y_len = multiprocessing.Value('i',len(y), lock=False)
def init(y_to_share, new_y_to_share):
    global y, new_y
    y = y_to_share
    new_y = new_y_to_share


y[480:520] = [1] * 40

dt.value = 0.01

# our rule for reaction-diffusion

def advance():
    global y, new_y
    n = len(y)
    new_y = list(y)    
    for j in xrange(n):
        new_y[j] += dt * (20 * (y[j - 1] - 2 * y[j] + y[(j + 1) % n])
                               - y[j] * (1 - y[j]) * (0.3 - y[j]))
    y = new_y
    return y

# advance through t (t = i * dt) is at least 100; plot
# every 20

chunks = len(y)/num_processes
y_range = range(len(y))
y_range = [y_range[i:i+chunks] for i in range(0, len(y_range), chunks)]
p = multiprocessing.Pool(num_processes, initializer=init, initargs=(y, new_y))
i = 0
start = time.time()
while i * dt.value <= 100:
    if i * dt.value % 20 == 0:
        pyplot.plot(y, label='t = %g' % (i * dt.value))
    arr = p.map(advance, (y, new_y))#hand in an array of indices
    i += 1
    #print i * dt.value
end = time.time()

elapsed = end-start
print elapsed
pyplot.legend()
pyplot.show()

修改:发布实际错误

错误:

runfile('/home/kevin/Downloads/cbb750_parallel_hw/propagating-signal-parallel.py', wdir='/home/kevin/Downloads/cbb750_parallel_hw')
Traceback (most recent call last):

  File "<ipython-input-64-5ad3fdf93b59>", line 1, in <module>
    runfile('/home/kevin/Downloads/cbb750_parallel_hw/propagating-signal-parallel.py', wdir='/home/kevin/Downloads/cbb750_parallel_hw')

  File "/usr/local/lib/python2.7/dist-packages/spyder/utils/site/sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "/usr/local/lib/python2.7/dist-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile
    builtins.execfile(filename, *where)

  File "/home/kevin/Downloads/cbb750_parallel_hw/propagating-signal-parallel.py", line 45, in <module>
    arr = p.map(advance, (y, new_y))#hand in an array of indices

  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()

  File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
    raise self._value

PicklingError: Can't pickle <class 'multiprocessing.sharedctypes.c_double_Array_1000'>: attribute lookup multiprocessing.sharedctypes.c_double_Array_1000 failed

任何人都可以帮我解决这个问题吗?我不确定我做错了什么,但我想使用pool.map。

0 个答案:

没有答案