给出AttributeError的多处理示例

Pic*_*Man 22 python multithreading

我试图在我的代码中实现多处理,所以,我想我会开始学习一些例子.我使用了本文档中的第一个示例.

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我得到了一个AttributeError: can't get attribute 'f' on <module '__main__' (built-in)>.我不知道为什么我会收到这个错误.如果有帮助,我也使用Python 3.5.

hr8*_*r87 30

这个问题似乎是多处理的设计特征.Pool.请参阅https://bugs.python.org/issue25053.由于某种原因,Pool并不总是使用未在导入模块中定义的对象.因此,您必须将函数写入不同的文件并导入模块.

文件:defs.py

def f(x):
    return x*x
Run Code Online (Sandbox Code Playgroud)

文件:run.py

from multiprocessing import Pool
import defs

 if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(defs.f, [1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

如果您使用打印或不同的内置函数,该示例应该有效.如果这不是一个错误(根据链接),那么选择的示例就会很糟糕.

  • 对我来说,仅在池创建(或导入)上面定义函数 f() 并不能解决问题(Win 10,Python 3.6.8) (11认同)
  • 我也一样 - Pool() 仍然无法使用这些建议。ThreadPool() 按预期工作,但它是一个完全不同的函数。 (3认同)
  • 当我运行脚本时,我得到:AttributeError: __exit__。原来问题出在“with”语句上,它需要一个带有“__ enter __”和“__ exit __”方法的对象。所以我不得不将其更改为: p = Pool(5) 并且它起作用了。非常感谢! (2认同)
  • 在创建Pool实例之前,必须定义f()函数,否则工作进程将看不到您的函数。但是,根据我的理解,您不必强行使用导入。 (2认同)

Mic*_*ner 21

multiprocessing模块在 IPython 使用方面有一个主要限制:

此包中的功能要求__main__模块可由子项导入。[...] 这意味着某些示例(例如multiprocessing.pool.Pool示例)在交互式解释器中不起作用。[来自文档]

幸运的是,有一个multiprocessing称为模块的分支,multiprocess它使用dill而不是pickle进行序列化,并方便地克服了这个问题。

只需在您的导入中安装multiprocess并替换multiprocessingmultiprocess

import multiprocess as mp

def f(x):
    return x*x

with mp.Pool(5) as pool:
    print(pool.map(f, [1, 2, 3, 4, 5]))
Run Code Online (Sandbox Code Playgroud)

当然,按照本答案中的建议将代码外部化也有效,但我发现它非常不方便:这不是我使用 IPython 环境的原因(以及方式)。

<tl;dr> multiprocessing不能立即在 IPython 环境中工作,请改用它的 fork multiprocess

  • 谢谢,简单的多重处理在 2021 年不起作用,这绝对是疯狂的。 (9认同)
  • “multiprocess”分支似乎没有相同的模块 - 例如它找不到 Process、freeze_support 和 Queue? (2认同)
  • 这在 IPython(Python 3.9、macOS 11)中完美运行! (2认同)

Ata*_*dow 12

此答案适用于2021 年Windows 10上遇到此错误的用户。

自从我自己发现这个错误以来,我已经对此错误进行了一些研究。在运行有关多处理的官方 Python 3 文档中的任何示例时,我会收到此错误。

测试环境:

  • x86 Windows 10.0.19043.1165 + Python 3.9.2 - 有错误
  • x86 Windows 10.0.19043.1165 + Python 3.9.6 - 有错误
  • x86 Windows 10.0.19043.1110 + Python 3.9.6 - 有错误
  • ARM Windows 10.0.21354.1 + Python 3.9.6 - 无错误(来自 DEV 分支的版本)
  • ARM macOS 11.5.2 + Python 3.9.6 - 无错误

我没有办法在其他条件下测试这种情况。但我的猜测是问题出在 Windows 上,因为开发版本“10.0.21354.1”中没有这样的错误,但这个 ARM 版本可能有 x86 模拟。

另请注意,Python 3.9.2 发布时(二月)不存在此类错误。由于一直以来我都在同一台计算机上工作,所以当以前工作的代码停止工作,并且只有 Windows 版本发生变化时,我对这种情况感到惊讶。

我无法在 Python bug 跟踪器中找到具有类似情况的 bug 请求(我可能做了一个糟糕的搜索)。而标有“正确答案”的消息则指的是不同的情况。该问题很容易重现,您可以尝试在新安装的 Windows 10 + Python 3 上遵循多处理文档中的任何示例。

稍后我将有机会查看Python 3.10和最新版本的Windows 10。我对Windows 11背景下的这种情况也很感兴趣。

如果您有有关此错误的信息(链接到错误跟踪器或类似内容),请务必分享。

目前我切换到Linux继续工作。