问题:
我想在所有进程中访问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)
答案 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)