我是python中多处理的新手,并且遇到了Pool的一些问题:操作系统:Mac Monterey M1芯片Python 3.9.12
在module.py:我试过了
def foo(x)
...
return y
pool = mp.Pool(8)
results = pool.map_async(foo, args)
also tried pathos:
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将包安装到本地。
当前错误信息包括:对多处理
AttributeError: Can't pickle local object 'search.<locals>.foo
和for pathos
TypeError: no default __reduce__ due to non-trivial __cinit__
注。我是stackoverflow的新手。我正在尽我最大的努力陈述这些问题。我不确定需要什么信息来解决这个问题。每次有人询问新信息时,我都会尽快更新问题。所以请保持礼貌。
我是dill
,pathos
和multiprocess
的作者。看起来你有一个不会序列化的对象。你的问题没有提供足够的信息让我给你一个我知道会起作用的解决方案——但我可以给你一些尝试的东西。
- 在
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
以上将改变全局命名空间中对象的处理方式,所以如果你感兴趣的函数可以序列化,但是在全局字典中有一个不可序列化的对象…那么,对上述序列化变体的更改可能会避免"坏";对象。您还可以识别导致失败的对象,并将其从当前名称空间中删除。但是,如果您感兴趣的函数需要它,那么您需要重新重构代码。
- 重构代码,可能包括
__reduce__
方法,或类似的(例如set/get状态方法)。
参见pickle
中的__reduce__
文档。你从pathos
看到的错误告诉我,你正在运行一个用C编写的对象(它有一个__cinit__
),因此需要一些额外的方法来告诉pickle
或dill
如何保存其状态。这里可能存在的问题是,您没有创建有问题的对象,它来自您正在导入的某个模块。这就导致了案例#3,但是如果没有详细的代码,我不能说更多。