多处理结果列表

multiprocessing result to list

我想将我的多处理结果放到 2 个列表中,我该怎么做。我在下面试过,但只得到最后一个列表。

def multiply(x, y):
  return x * x, x * y

#use wrap
def multiply_wrapper(args):
  return multiply(*args)

#use wrap
if __name__ == "__main__":
  list_x = []
  list_y = []

  p = Pool(4)
  values = [(x, y) for x in range(4) for y in range(4)]
  results = p.map(multiply_wrapper, values)
  
  list_x.append(results[0][0])
  list_y.append(results[0][1])

  print(list_x)
  print(list_y)


  

我尝试了您的代码并做了一些小改动,results 看起来不错。

您是否可能希望多处理根据哪个工作人员处理数据块来分隔数据?幸运的是,它为我们加入了数据。

以下灵感来自 docs 和您的原始问题。另外不要忘记释放资源,因为垃圾收集器不会为您做这件事。

from multiprocessing.pool import Pool
import pprint

def multiply(x, y):
  return x * x, x * y

#use wrap
def multiply_wrapper(args):
  return multiply(*args)

#use wrap
if __name__ == "__main__":
  p = Pool(4)
  values = [(x, y) for x in range(4) for y in range(4)]
  results = p.map(multiply_wrapper, values)
  p.close()
  p.join()
  pprint.pprint(results)

输出:

[(0, 0),
 (0, 0),
 (0, 0),
 (0, 0),
 (1, 0),
 (1, 1),
 (1, 2),
 (1, 3),
 (4, 0),
 (4, 2),
 (4, 4),
 (4, 6),
 (9, 0),
 (9, 3),
 (9, 6),
 (9, 9)]

回复评论:

要从 Pool.map 的输出中获得 2 个列表,我们可以解压缩结果。

if __name__ == "__main__":
    p = Pool(4)
    values = [(x, y) for x in range(4) for y in range(4)]
    results = p.map(multiply_wrapper, values)
    p.close()
    p.join()

    list_x = [x[0] for x in results]
    list_y = [x[1] for x in results]
    pprint.pprint(list_x)
    pprint.pprint(list_y)

输出:

[0, 0, 0, 0, 1, 1, 1, 1, 4, 4, 4, 4, 9, 9, 9, 9]
[0, 0, 0, 0, 0, 1, 2, 3, 0, 2, 4, 6, 0, 3, 6, 9]