从多个处理器访问共享阵列

时间:2017-04-16 01:17:59

标签: python multiprocessing

问题:

我想在所有进程中访问y共享变量,因为对于new_y中的每个元素,我想让它成为当前的y和下一个y 类似于new_y [i] = y [i] + y [i + 1]。如何获取当前池工作者所在的数组y的索引?

import multiprocessing

num_processes = 2
y = multiprocessing.Array('d', 6, lock=False)
new_y = multiprocessing.Array('d', 6, lock=False)

def init_process(y_to_share, new_y_to_share):
    global y, new_y
    y = y_to_share
    new_y = new_y_to_share

process_pool = multiprocessing.Pool(
                   num_processes,
                   initializer=init_process,
                   initargs=(y, new_y))

dt = 0.0001
def sq():
  global y
  global new_y
  print new_y[0]
  print multiprocessing.current_process()
  #Here I want to do y at the current index and add the y value of the next index
  #something like new_y[i] = y[i]+y[i+1]


process_pool.map(sq, y)

1 个答案:

答案 0 :(得分:1)

我犹豫不决,因为我可能完全误解了这个问题,但您可以通过更改您在父进程中迭代的内容来处理这个问题,以便它具有您想要的相邻数据。

import multiprocessing

def worker(yvals):
    return yvals[0] + yvals[1]

if __name__ == "__main__":
    y_list = list(range(6))
    pool = multiprocessing.Pool()
    new_y = list(pool.map(worker, 
        (y_list[i:i+2] for i in range(len(y_list)-1))))
    pool.close()
    print(new_y)

在linux上,当池启动时,它具有父地址空间的写时复制视图,并且只能读取列表。我不确定Windows在这种情况下会发生什么,但它试图挑选父环境并用它初始化孩子 - 让我想知道为什么有人会在Windows上使用这个模块! - 至少对于linux和osx来说,这样可以工作

import multiprocessing

def worker(y_index):
    return y_list[y_index] + y_list[y_index+1]

if __name__ == "__main__":
    y_list = list(range(6))
    pool = multiprocessing.Pool()
    new_y = list(pool.map(worker, range(len(y_list)-1)))
    print(new_y)