[英]Post-processing results after multi-processing in Python
因此,我有一个简单的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)
,它会给我我想要的东西,即串联列表。 但是,如果我最后在主程序中放了那条简单的线,那就行不通了。 谁能告诉我该如何解决?
PS:这是我生成的一个非常简单的示例,因此您可以了解发生了什么。 我真正的问题是方法更加复杂,用MP完成后我无法进行后期处理。
您的问题是,当您运行np.concatenate
,它没有在main函数中完成。 我怀疑您遇到的问题是Spyder特有的,但是更新缩进应该可以解决它。
正如已经暗示了@Ares一样,您可以通过将if __name__ == "__main__"
-statement南部的所有if __name__ == "__main__"
缩进if __name__ == "__main__"
解决此问题。
仅供参考,这发生在Windows上,它不提供启动Unix-y系统等新进程的功能,而是使用“ spawn”作为默认(唯一)启动方法。 Spawn意味着,操作系统必须为每个工作进程从头开始使用解释器启动新进程。
您的工作进程将需要导入目标函数my_function
。 发生这种情况时, if __name__ == "__main__":
- if __name__ == "__main__":
不受保护的所有内容也将在导入时的每个子进程中运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.