多处理两个函数使用和修改相同的列表

时间:2014-05-18 17:20:33

标签: python multiprocessing

我有4个列表,每个浮动3个浮点数。我有两个函数(实际上实现为一个函数 - 一个不同的int参数更改它所作用的列表的元素),我想并行运行。它们都采用所有列表并使用它们来进行一些计算。第一个函数的结果 - 4个浮点数 - 每个列表一个 - 用于更改每个列表的第二个元素,而第二个函数的结果用于更改所有lsits中的第三个元素。然后我想继续下一次迭代,其中函数执行相同但使用更新的列表(所有列表中的第一个元素保持不变)。

代表我的想法的简单代码

l1 = [a,b,c]
l2 = [d,e,f]
l3 = [g,h,i]
l4 = [j,k,l]
def func(l1, l2, l3, l4, k):
    do something with the lists on element k of them
    return (x1, x2, x3, x4, k)

pool = multi.Pool(processes = 2)
while nstep <= maxnsteps:
    for i in range(1,3):
        pool.apply_async(func, args = (xval, yval, vxval, vyval, i,))
    nstep = nstep + 1
pool.close()
pool.join()

因此,对于nstep的下一个值,我希望函数使用列表的更新版本及其在上一次迭代中计算的值。我觉得我对此完全错误

1 个答案:

答案 0 :(得分:0)

这是没有多处理的代码。在使用l1_copy1=list(l1)处理列表之前,您需要复制列表。然后,您可以合并来自new_l1=[l1_copy1[0], l1_copy2[1], l1[2]]等两个函数的修改后的列表。 另一个评论;使用matrice或创建一个类matrice来保存列表,这样你就可以遍历它们。

l1 = [1,2,3]
l2 = [4,5,6]
l3 = [7,8,9]
l4 = [10,11,12]

def increment_at_position_k(l1, l2, l3, l4, k):
    l1, l2, l3, l4 = list(l1), list(l2), list(l3), list(l4) # copy lists (otherwise the list is modified directly)
    l1[k] += 1
    l2[k] += 1
    l3[k] += 1
    l4[k] += 1
    return (l1, l2, l3, l4, k)

for iterations in [0]:
    results = []
    for i in [1,2]:
        ret = increment_at_position_k(l1, l2, l3, l4, i)
        results.append(ret)
    for res in results:
        local_l1, local_l2, local_l3, local_l4, k = res # unpack result
        #update global list
        l1[k] = local_l1[k]
        l2[k] = local_l2[k]
        l3[k] = local_l3[k]
        l4[k] = local_l4[k]
print l1
print l2
print l3
print l4