[英]Multiprocessing issue in with python
我是 python 的多处理新手,遇到了池的一些问题:操作系统:Mac Monterey M1 芯片 Python 3.9.12
在 module.py 中:我试过了
def foo(x)
...
return y
pool = mp.Pool(8)
results = pool.map_async(foo, args)
也试过悲情:
def foo(x)
...
return y
pool = ProcessPool(8)
results = pool.amap(foo, args)
在主脚本中:
import module
def main():
test = module.foo(x)
if __name__ == "__main__":
main()
我还使用 setup.py 将 package 安装到本地。
当前错误消息包括:对于多处理
AttributeError: Can't pickle local object 'search.<locals>.foo
和悲伤
TypeError: no default __reduce__ due to non-trivial __cinit__
PS:我是stackoverflow的新手。 我正在尽力解决 state 的问题。 我不确定解决问题可能需要哪些信息。 每次有人要求我尽快提供新信息时,我都会更新问题。 所以请保持礼貌。
我是dill
、 pathos
和multiprocess
的作者。 看起来您有一个无法序列化的 object。 你的问题没有提供足够的信息让我给你一个我知道会起作用的解决方案——但我可以给你一些尝试。
dill
中尝试不同的序列化变体: Python 3.7.15 (default, Oct 12 2022, 04:11:53)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.settings['recurse'] = True
上面将改变全局命名空间中对象的处理方式,所以如果 function 你有兴趣传递序列化 ok,但全局字典中有一个不可序列化的 object ...那么对上述序列化变体的更改可能会避免“坏” " object。您还可以确定导致故障的 object,并将其从当前命名空间中删除。 但是,如果您感兴趣的 function 需要它,则您需要交替重构代码。
__reduce__
方法或类似方法(例如设置/获取 state 方法)。 请参阅pickle
中的__reduce__
文档。 您从pathos
看到的错误告诉我您正在运行一个 object,它是用 C 编写的(它有一个__cinit__
),因此需要一些额外的方法来告诉pickle
或dill
如何保存它的 state。您可能遇到的问题这是您没有创建有问题的 object,它来自您正在导入的某个模块。 这导致案例 #3,但没有关于您的代码的详细信息,我不能说更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.