Post-Python多处理后的处理结果
Post-processing results after multi-processing in Python
所以我有一个简单的 MP 代码,它非常有用。但是,当我对通过 MP 生成的数据进行非常简单的 post 处理时,代码不再起作用。它永远不会停止并永远运行!这是代码(再次完美运行):
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)
,它会给我我想要的,即一个串联列表。但是,如果我将那行简单的代码放在主程序的最后,它就不起作用了。谁能告诉我如何解决这个问题?
P.S。这是我生成的一个非常简单的示例,因此您可以了解发生了什么;我真正的问题要复杂得多,在完成 MP 后我无法进行 post 处理。
你的问题是当你运行np.concatenate
时,它没有在main函数中完成。我怀疑您遇到的问题是 Spyder 特有的,但更新缩进应该可以解决它。
正如@Ares 已经暗示的那样,您可以通过将 if __name__ == "__main__"
语句以南的所有内容缩进 if 块来解决问题。
仅供参考,这发生在 Windows 上,它不提供用于启动新进程(如 Unix-y 系统)的分叉,而是使用 'spawn' 作为默认(且唯一)启动方法。 Spawn 意味着,OS 必须从头开始为每个工作进程启动一个带有解释器的新进程。
您的工作进程将需要导入您的目标函数 my_function
。发生这种情况时,if __name__ == "__main__":
块中未受保护的所有内容也将在导入时的每个子进程中 运行。
所以我有一个简单的 MP 代码,它非常有用。但是,当我对通过 MP 生成的数据进行非常简单的 post 处理时,代码不再起作用。它永远不会停止并永远运行!这是代码(再次完美运行):
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)
,它会给我我想要的,即一个串联列表。但是,如果我将那行简单的代码放在主程序的最后,它就不起作用了。谁能告诉我如何解决这个问题?
P.S。这是我生成的一个非常简单的示例,因此您可以了解发生了什么;我真正的问题要复杂得多,在完成 MP 后我无法进行 post 处理。
你的问题是当你运行np.concatenate
时,它没有在main函数中完成。我怀疑您遇到的问题是 Spyder 特有的,但更新缩进应该可以解决它。
正如@Ares 已经暗示的那样,您可以通过将 if __name__ == "__main__"
语句以南的所有内容缩进 if 块来解决问题。
仅供参考,这发生在 Windows 上,它不提供用于启动新进程(如 Unix-y 系统)的分叉,而是使用 'spawn' 作为默认(且唯一)启动方法。 Spawn 意味着,OS 必须从头开始为每个工作进程启动一个带有解释器的新进程。
您的工作进程将需要导入您的目标函数 my_function
。发生这种情况时,if __name__ == "__main__":
块中未受保护的所有内容也将在导入时的每个子进程中 运行。