在 Python 中使用 Pool 类进行多处理会产生 Pickling 错误

Posted

技术标签:

【中文标题】在 Python 中使用 Pool 类进行多处理会产生 Pickling 错误【英文标题】:Multiprocessing using Pool class in Python giving Pickling error 【发布时间】:2020-05-16 19:55:36 【问题描述】:

我正在尝试在 zeppelin 笔记本(在 Windows 中)中的 python3.6 中运行一个简单的多处理示例,但我无法执行它。以下是我使用的代码:


def sqrt(x):
    return x**0.5

numbers = [i for i in range(1000000)]
with Pool() as pool:
    sqrt_ls = pool.map(sqrt, numbers)

运行此代码后,我收到以下错误:

Traceback (most recent call last):
  File "/tmp/zeppelin_python-3196160128578820301.py", line 315, in <module>
    exec(code, _zcUserQueryNameSpace)
  File "<stdin>", line 6, in <module>
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
    put(task)
  File "/usr/lib64/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib64/python3.6/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function sqrt at 0x7f6f84f1a620>: attribute lookup sqrt on __main__ failed

我不确定是不是只有我一个人面临这个问题。正如我看到的很多文章,人们可以轻松地运行代码。如果您知道解决方案,请帮助

谢谢

【问题讨论】:

在我的机器上运行 Python 3.6.9。 唯一可疑的部分是回溯的前两步。你如何运行这段代码? 我在 zeppelin notebook 中运行代码。 您应该将该信息显着地添加到您的问题中。 更新了我的帖子。谢谢 【参考方案1】:

来自multiprocessing documentation:

注意:此包中的功能要求子模块可以导入 ma​​in 模块。这在编程指南中有介绍,但值得在这里指出。这意味着某些示例(例如 Pool 示例)将无法在交互式解释器中运行。

笔记本在后台运行 Python 交互式解释器,因此这可能就是您收到此错误的原因。您可以尝试在 if __name__ == '__main__': 语句中运行您的代码。

【讨论】:

【参考方案2】:

Zeppelin 笔记本无法很好地模拟普通模块,无法支持用于识别另一个进程的正确操作的酸洗。您可以按照通常的方式将您想要调用的所有函数放入您import 的适当模块中。

【讨论】:

以上是关于在 Python 中使用 Pool 类进行多处理会产生 Pickling 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥多处理会减慢嵌套的 for 循环?

python 进程池pool简单使用

python学习笔记——multiprocess 多进程组件Pool

我在做啥的 Python 多处理进程或池?

Python multiprocessing.Pool:AttributeError

Python multiprocessing.Pool 忽略类方法