我刚接触过python中的多处理,在Pool: OS: Monterey M1芯片Python3.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将包安装到本地。
当前错误消息包括:用于多处理
AttributeError: Can't pickle local object 'search.<locals>.foo
也为哀伤
TypeError: no default __reduce__ due to non-trivial __cinit__
P.S.:我对堆积如山很陌生。我正在尽我最大的努力陈述这些问题。我不知道需要什么信息才能解决这个问题。每当人们要求我尽快提供新的信息时,我都在更新这个问题。所以请礼貌点。
发布于 2022-11-13 12:41:28
我是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
上面的内容将改变全局命名空间中对象的处理方式,因此如果您感兴趣传递的函数可以序列化ok,但是全局dict中有一个不可序列化的对象.然后,对上述序列化变量的更改可能会避免“坏”对象。您还可以标识导致失败的对象,并将其从当前命名空间中删除。但是,如果您感兴趣的函数需要它,则需要重构代码。
__reduce__
方法或类似的方法(例如set/get状态方法).见__reduce__
docs in pickle
。从pathos
中看到的错误告诉我,您正在运行到一个用C编写的对象(它有一个__cinit__
),因此需要一些额外的方法来告诉pickle
或dill
如何保存它的状态。这里可能存在的问题是,您没有创建有问题的对象,而且它来自您正在导入的某个模块。这将导致第3种情况,但是如果没有关于代码的详细信息,我就不能说得更多了。
https://stackoverflow.com/questions/74416483
复制相似问题