首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蟒蛇并行处理

蟒蛇并行处理
EN

Stack Overflow用户
提问于 2018-09-21 16:36:11
回答 2查看 42关注 0票数 0

我的设置如下:我有一个以目标函数f为输入的方法。作为该方法的子路由,我想在一小部分点上计算f。由于f具有很高的复杂性,我考虑将其并行化。所有在线示例都挂起了,即使是像5点集合上的平方这样的微不足道的函数。他们使用的是多进程库--我不知道我做错了什么。我不确定如何将该__name__ == "__main__"语句封装在我的方法中。(既然它是模块的一部分-我想我应该使用模块名称而不是"__main__"?)

我一直使用的代码看起来像这样

代码语言:javascript
复制
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__-语句?是否值得将其并行化?(一次函数求值可能需要几分钟,在串行中,总运行时间加起来为几个小时……)

EN

回答 2

Stack Overflow用户

发布于 2018-09-21 16:58:45

根据documentation的说法:

close()

阻止将更多任务提交到池。完成所有任务后,工作进程将退出。

terminate()

立即停止工作进程,而不完成未完成的工作。当池对象被垃圾回收时

将立即调用terminate()。

join()

等待工作进程退出。在使用join()之前,必须先调用close()或terminate()。

因此,您应该添加:

代码语言:javascript
复制
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 == ==来保护它

票数 1
EN

Stack Overflow用户

发布于 2018-09-21 16:55:51

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

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

这个问题的一个症状是,当你使用像htop这样的东西时,所有的内核都在启动,但速度小于100%。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52439778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档