【问题标题】:Multiprocessing in Python using Pool Class使用池类在 Python 中进行多处理
【发布时间】:2020-01-30 07:51:32
【问题描述】:

我想在 windows(zeppelin notebook)的 python(特别是 Pool Class)中使用多处理。但是在阅读了很多之后我才知道池类在其后端使用了泡菜,并且只能用于可以泡菜的对象。由于我无法在 Python 中使用 pickle 序列化函数或类(至少在 3.6 版本中),我发现 pathos.multiprocessing 库可用于执行多处理,因为它在后端使用 dill 而不是 pickle根据dill 包文档可以序列化任何东西。但是当我使用它时,我得到了错误。以下是我使用的简单代码:

import pathos.multiprocessing as mp

def cube(x):
    return x**3

p = mp.Pool(4)

p.apply(cube, [1,2,3])

这是我得到的错误:

py4j.protocol.Py4JError: An error occurred while calling o0.__getstate__. Trace:
py4j.Py4JException: Method __getstate__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:335)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:344)
    at py4j.Gateway.invoke(Gateway.java:279)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:209)
    at java.lang.Thread.run(Thread.java:748)

即使我使用了 map、apply_async 或 map_async,我也遇到了同样的错误。谁能帮我找出问题。

提前致谢

【问题讨论】:

  • 对于您给出的示例,标准的多进程库将起作用。您是否要绘制更复杂的地图?
  • 嗨,James,您不能同时使用标准的多处理库来执行此操作。当您使用标准库执行此操作时,您会收到 pickle 错误 - _pickle.PicklingError: Can't pickle <function cube at 0x7f3283ee3048>: attribute lookup cube on __main__ failed
  • 您是否尝试在交互模式下运行?
  • 是的,我正在使用 zeppelin 笔记本
  • @ShubhamKedia 你有没有解决这个问题?

标签: python serialization python-multiprocessing dill pathos


【解决方案1】:

如果我使用这样的代码:

import multiprocessing as mp

def cube(x):
    return x**3

if __name__ == '__main__':
    p = mp.Pool(4)
    p.apply(cube, [1,2,3])

我没有看到任何返回的输出。不知道是什么问题。

【讨论】:

  • 阅读 cmets,他正在通过 Zeppelin notebook 以交互模式运行
猜你喜欢
  • 2019-07-26
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2022-01-08
  • 2023-02-22
  • 2013-12-01
  • 2021-07-24
  • 2020-08-14
相关资源
最近更新 更多