【问题标题】:Multiprocessing in Python hanging the systemPython中的多处理挂起系统
【发布时间】:2021-06-05 08:50:47
【问题描述】:

我正在处理多处理并尝试复制以下链接中给出的代码:

Python Multiprocessing imap

我的系统在 Spyder 和 Jupyter 中都挂起,如下所示。可能是什么原因?

以下是完全复制并运行的代码。但它只是挂起。

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(3) as p:
        print(p.map(f, [1, 2, 3]))

【问题讨论】:

  • 您的代码与您链接的代码不同 - 特别是您没有包含 if __name__=‘__main__’: 行 - 为什么不呢?尝试将其添加到代码中。仅供参考,多处理文档中的几乎每个示例都包含这一行;它不是偶然出现的,请参阅docs.python.org/3/library/multiprocessing.html
  • 嗨,Barny,我的系统似乎有问题。我仍然不确定发生了什么。我已经浏览了您粘贴的链接。它挂了太多时间,一个小时后显示以下消息:>
  • IPython Notebooks 通常在多处理方面存在大量问题。它们可以解决,但我发现使用更传统的 IDE 更容易,它使用普通的 python 解释器调用您的代码。
  • 这是我个人的意见,但我认为 Jupyter 和所有其他 IPython Notebook 程序仅对需要“漂亮”的现场演示才真正有用。使用 python 本身(具体来说是 Cpython)编写真正的代码要好得多,因为这就是一切的设计目的。不要乱说“哦,我需要使用文档中没有的这个特殊技巧才能使某些东西起作用”。
  • 如果您阅读docs on multiprocessing 的开头部分为: 注意此包中的功能要求 __main__ 模块可由子模块导入。这在编程指南中有介绍,但值得在这里指出。这意味着某些示例,例如 multiprocessing.pool.Pool 示例将无法在交互式解释器中工作。例如:,您会看到这不起作用。 将函数f 放入另一个.py 文件并导入它以使其工作。

标签: python multiprocessing


【解决方案1】:

如果您阅读docs on multiprocessing,尤其是以下部分:

...你会发现这行不通。解决方案是将函数 f 放在另一个 .py 文件中并导入它以使其工作。例如:

文件 worker.py:

def f(x):
    return x*x

您修改后的代码:

from multiprocessing import Pool
from worker import f

if __name__ == '__main__':
    with Pool(3) as p:
        print(p.map(f, [1, 2, 3]))

【讨论】:

  • 非常感谢先生。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2020-06-05
  • 2020-04-11
相关资源
最近更新 更多