我的设置如下:我有一个以目标函数f为输入的方法。作为该方法的子路由,我想在一小部分点上计算f。由于f具有很高的复杂性,我考虑将其并行化。所有在线示例都挂起了,即使是像5点集合上的平方这样的微不足道的函数。他们使用的是多进程库--我不知道我做错了什么。我不确定如何将该__name__ == "__main__"语句封装在我的方法中。(既然它是模块的一部分-我想我应该使用模块名称而不是"__main__"?)
我一直使用的代码看起来像这样
from multiprocessing.pool import Pool
from multiprocessing import cpu_count
x = [1,2,3,4,5]
num_cores = cpu_count()
def f(x):
return x**2
if __name__ == "__main__":
pool = Pool(num_cores)
y = list(pool.map(f, x))
pool.join()
print(y)当在我的spyder中执行这段代码时,它需要很长时间才能完成。
所以我的主要问题是:我在这段代码中做错了什么?当这个代码是一个更大的方法的一部分时,我如何封装__name__-语句?是否值得将其并行化?(一次函数求值可能需要几分钟,在串行中,总运行时间加起来为几个小时……)
发布于 2018-09-21 16:58:45
根据documentation的说法:
close()
阻止将更多任务提交到池。完成所有任务后,工作进程将退出。
terminate()
立即停止工作进程,而不完成未完成的工作。当池对象被垃圾回收时
将立即调用terminate()。
join()
等待工作进程退出。在使用join()之前,必须先调用close()或terminate()。
因此,您应该添加:
from multiprocessing.pool import Pool
from multiprocessing import cpu_count
x = [1,2,3,4,5]
def f(x):
return x**2
if __name__ == "__main__":
pool = Pool()
y = list(pool.map(f, x))
pool.close()
pool.join()
print(y)您可以不带任何参数调用池,默认情况下它将使用cpu_count
如果进程数为None,则使用cpu_count()返回的数字
关于if name == "main",请阅读更多信息here。
,所以你需要考虑一下,你只想在主程序中执行哪些代码。最明显的例子是,您希望创建子进程的代码仅在主程序中运行-因此,应该通过name == ==来保护它
https://stackoverflow.com/questions/52439778
复制相似问题