【问题标题】:Post-processing results after multi-processing in PythonPython中多处理后的后处理结果
【发布时间】:2019-04-11 05:51:11
【问题描述】:

所以我有一个简单的 MP 代码,它就像一个魅力。但是,当我对通过 MP 生成的数据进行非常简单的后处理时,代码不再起作用。它永远不会停止和运行!这是代码(它再次完美运行):

import numpy as np
from multiprocessing import Pool

n = 4
nMCS = 10**5

def my_function(j):
    result = []
    for j in range(nMCS // n):
        a = np.random.rand(10,2)
        result.append(a) 
    return result

if __name__ == '__main__':
    __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" # this is because I am using Spyder!

    pool = Pool(processes = n) 

    data = pool.map(my_function, [i for i in range(n)])

    pool.close()
    pool.join()

#final_result = np.concatenate(data)   ### this is what ruins my code! ###

同时,如果我在最后添加final_result = np.concatenate(data),它永远不会起作用!我正在使用 Spyder,如果我在 MP 完成后在控制台中简单地键入 final_result = np.concatenate(data),它会给我我想要的,即一个串联列表。但是,如果我把那条简单的行放在最后的主程序中,它就是行不通的。谁能告诉我如何解决这个问题?

附:这是我生成的一个非常简单的示例,因此您可以了解发生了什么;我真正的问题要复杂得多,在我完成 MP 后,我无法进行后期处理。

【问题讨论】:

  • 你的缩进是错的,还是final_result不是main函数的一部分?如果不是,那可能是问题的一部分。
  • 感谢您的评论!我想你是对的,我想既然我已经完成了 MP,就不应该有缩进,但事实证明我仍然应该缩进(我想知道为什么!)。谢谢!

标签: python multiprocessing post-processing


【解决方案1】:

正如@Ares 已经暗示的那样,您可以通过将if __name__ == "__main__" 语句以南的所有内容缩进if 块来解决问题。

仅供参考,这发生在 Windows 上,它不提供用于启动新进程(如 Unix-y 系统)的分叉,但使用“spawn”作为默认(且唯一)启动方法。 Spawn 意味着,操作系统必须为每个工作进程从头开始使用解释器启动一个新进程。

您的工作进程将需要导入您的目标函数my_function。发生这种情况时,if __name__ == "__main__":-block 中未受保护的所有内容也将在导入时在每个子进程中运行。

【讨论】:

    【解决方案2】:

    您的问题是,当您运行np.concatenate 时,它并没有在 ma​​in 函数中完成。我怀疑您遇到的问题是 Spyder 特有的,但更新缩进应该可以解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多