首页 > 解决方案 > 在 Python 中使用 Pool 类进行多处理会产生 Pickling 错误

问题描述

我正在尝试在 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

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

谢谢

标签: pythonmultiprocessingpickledillpathos

解决方案


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


推荐阅读