当前位置: 首页 > 面试题库 >

多处理池示例不起作用并冻结内核

冯野
2023-03-14
问题内容

我正在尝试并行化脚本,但是由于未知的原因,内核只是冻结而没有引发任何错误。

最小的工作示例:

from multiprocessing import Pool

def f(x):
  return x*x

p = Pool(6)
print(p.map(f, range(10)))

有趣的是,如果我在另一个文件中定义函数然后将其导入,则一切都可以正常工作。如何使它工作而无需另一个文件?

我使用spyder(anaconda),如果从Windows命令行运行代码,则结果相同。


问题答案:

发生这种情况是因为在子进程导入时,您没有保护代码的“过程”部分免于重新执行f

它们需要import f,因为 Windows 不支持将fork作为新进程的启动方法(仅 spawn
)。必须从头开始一个新的Python进程,将其f导入,并且此导入还将触发在所有子进程…及其子进程及其子进程中创建另一个Pool。

为了防止这种递归,您必须if __name__ == '__main__':在上部(在导入时运行)和下部(仅在将脚本作为主脚本执行时运行)之间插入-线(仅对于父级情况)。

from multiprocessing import Pool

def f(x):
  return x*x

if __name__ == '__main__': # protect your program's entry point

    p = Pool(6)
    print(p.map(f, range(10)))

当与“ spawn”或“ forkserver”启动方法(而非默认的“ fork”)一起使用时,在Windows和Unix-
y系统上的多处理中必须这样分隔代码。通常,可以使用来修改启动方法multiprocessing.set_start_method(method)

从Python 3.8开始,
macOS 默认还使用“ spawn”而不是“ fork”。

通常的一个好习惯是,将 任何
脚本以高位“定义”和低位“执行为主”分开,以使代码可导入而无需不必要的部分执行,而仅当作为顶级脚本运行时才有意义。最后但并非最不重要的一点是,当您不混合定义和执行时,它有助于理解程序的控制流。



 类似资料:
  • 问题内容: 我正在尝试学习使用方法,但无法正常工作。这是文档中的代码 它应该输出 你好鲍勃 但是我得到了 没有错误或其他消息,它只是坐在那里,它从32位版本的python 2.7的Windows 7计算机上的已保存.py文件中运行 问题答案: 我的猜测是您正在使用IDLE尝试运行此脚本。不幸的是,此示例无法在IDLE中正确运行。请注意文档开头的注释: 注意:此软件包中的功能要求子 模块可以导入 主

  • 我是的新手,所以我试图为一个程序(我试图制作一个编译器)制作一个可执行文件,该程序使用一个setup.py脚本的模块: 我使用的是python 3.5,当我打开生成的向我抛出以下错误: 我怎样才能纠正这个错误?

  • 问题内容: 我正在尝试使用lib做一个邮箱检查器,它在没有gui的python,队列和多线程环境下可以正常工作。 但是,当我尝试放置一个gui时,我所做的每个功能都将gui冻结直到完成。 我尝试了各种文档中的许多东西(添加qthread,信号,游标等),而教程对我没有用。 有人可以帮助我了解如何在运行函数时设置文本或将文本附加到QtextEdit吗,因为它仅在完成后才起作用。 这是我的代码: 问题

  • 按预期更正代码:从多处理导入池导入信号导入时间导入操作系统 ================================================== 我发现了问题,当我使用map函数时,主func被阻塞,只有map函数被funish时才会调用信号处理程序。所以,使用"map_async"函数来解决这个问题要好得多。 以下是我的发现: 纯用C语言实现的长时间运行的计算(例如对大量文本进行

  • 我甚至不能使用Python 2.7中运行的多重处理包(使用spyder作为窗口上的用户界面)进行并行处理的最简单的例子,我需要帮助解决这个问题。我已经运行了conda更新,所以所有的包都应该是最新的和兼容的。 即使多处理软件包文档(如下所示)中的第一个示例也不起作用,它会生成4个新进程,但控制台只是挂起。在过去的3天里,我已经尝试了我能找到的一切,但是没有一个不挂起就运行的代码能够将我25%以上的

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind