【发布时间】: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