蟒蛇并行处理



>我在以下设置中:我有一个将目标函数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__ 语句? 甚至值得并行吗?(一个函数评估可能需要数分钟,而串行计算加起来总共运行了几个小时......

根据文档:

关闭((

Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit.

终止((

Stops the worker processes immediately without completing outstanding work. When the pool object is garbage collected

终止(( 将立即被调用。

join((

Wait for the worker processes to exit. One must call close() or terminate() before using join().

所以你应该加上:

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)

您可以在没有任何参数的情况下调用 Pool,默认情况下它将使用 cpu_count

如果进程为 None 则使用 cpu_count(( 返回的数字

关于 if名称== ">main",请在此处阅读更多信息。

因此,您需要考虑一下仅在主程序中执行哪些代码。最明显的例子是,您希望创建子进程的代码仅在主程序中运行 - 因此应该通过名称== 'main' 进行保护

您可能需要查看正在使用的 map 函数的 chunksize 参数。

在足够大的输入列表中,您的大量时间都花在简单地与单独的并行进程之间传递参数上。

这个问题的一个症状是,当你使用类似htop的东西时,所有内核都在发射,但<100%。

相关内容

  • 没有找到相关文章

最新更新