多处理仅适用于第一次迭代

Multiprocessing only works for the first iteration(多处理仅适用于第一次迭代)
本文介绍了多处理仅适用于第一次迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Python多处理。我将语句包装在一个函数中,然后使用多处理映射循环遍历该函数。我发现只有第一个迭代真正被处理了,而其余的没有(我通过打印结果进行了检查)。

以下是我的问题:

  1. 为什么只计算第一次迭代。
  2. 如何分别返回B、C、D三个数组
  3. 我的实际计算确实有太多的员工要计算和返回,所以有一个比将我所有的语句包装在一个函数中然后返回它们更高效的方法。 谢谢

import numpy as np
import multiprocessing as mp

B=np.full((5,4,4),np.nan)
C=np.full((5,4,4),np.nan)
D=np.full((5,4,4),np.nan)


def job1(i):
    print(i)
    A=np.ones((4,4))
    B[i,:,:]=A+1
    C[i,:,:]=2*A+2
    D[i,:,:]=A+5
    return B,C,D
#%%

P=mp.Pool(5)
result=P.map(job1,np.arange(5))
P.close()
P.join()



result[0] 
(array([[[ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]]]),

推荐答案

  1. 您的代码按预期工作。您有5个处理器(Pool(5))和5个要做的事情(np.arange(5)),所以每个任务都由每个处理器执行。由于评论中提到的@Michael Butscher原因,每个计算都不会共享。

  2. 您可以通过Pool操作得到结果后进行解析,如下所示(直观);

output = {'B':[], 'C':[], 'D':[]}
for r in result:
    output['B'].append(r[0])
    output['C'].append(r[1])
    output['D'].append(r[2])
  1. 如果看不到可重现的代码,就很难找出处理作业的最有效方法。要运行多个函数,请参阅以下链接;

Mulitprocess Pools with different functions

这篇关于多处理仅适用于第一次迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)