在 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:
注意:此包中的功能要求子模块可以导入 main 模块。这在编程指南中有介绍,但值得在这里指出。这意味着某些示例(例如 Pool 示例)将无法在交互式解释器中运行。
笔记本在后台运行 Python 交互式解释器,因此这可能就是您收到此错误的原因。您可以尝试在 if __name__ == '__main__':
语句中运行您的代码。
【讨论】:
【参考方案2】:Zeppelin 笔记本无法很好地模拟普通模块,无法支持用于识别另一个进程的正确操作的酸洗。您可以按照通常的方式将您想要调用的所有函数放入您import
的适当模块中。
【讨论】:
以上是关于在 Python 中使用 Pool 类进行多处理会产生 Pickling 错误的主要内容,如果未能解决你的问题,请参考以下文章
python学习笔记——multiprocess 多进程组件Pool