首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与python有关的多处理问题

与python有关的多处理问题
EN

Stack Overflow用户
提问于 2022-11-12 20:49:44
回答 1查看 51关注 0票数 -1

我刚接触过python中的多处理,在Pool: OS: Monterey M1芯片Python3.9.12中遇到了一些问题

在module.py:我试过了

代码语言:javascript
复制
def foo(x)
...
return y
pool = mp.Pool(8)
results = pool.map_async(foo, args)

也尝试过感伤:

代码语言:javascript
复制
def foo(x)
...
return y
pool = ProcessPool(8)
results = pool.amap(foo, args)

在主要剧本中:

代码语言:javascript
复制
import module

def main():
   test = module.foo(x)

if __name__ == "__main__":
   main()

我还使用setup.py将包安装到本地。

当前错误消息包括:用于多处理

代码语言:javascript
复制
AttributeError: Can't pickle local object 'search.<locals>.foo

也为哀伤

代码语言:javascript
复制
TypeError: no default __reduce__ due to non-trivial __cinit__

P.S.:我对堆积如山很陌生。我正在尽我最大的努力陈述这些问题。我不知道需要什么信息才能解决这个问题。每当人们要求我尽快提供新的信息时,我都在更新这个问题。所以请礼貌点。

EN

回答 1

Stack Overflow用户

发布于 2022-11-13 12:41:28

我是dillpathosmultiprocess的作者。看起来,您有一个不会序列化的对象。你的问题没有提供足够的信息让我给你一个解决方案,我知道它会奏效--但我可以给你一些东西去尝试。

dill中的

  1. 尝试不同的序列化变体

代码语言:javascript
复制
    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中有一个不可序列化的对象.然后,对上述序列化变量的更改可能会避免“坏”对象。您还可以标识导致失败的对象,并将其从当前命名空间中删除。但是,如果您感兴趣的函数需要它,则需要重构代码。

  1. 重构代码,可能包括__reduce__方法或类似的方法(例如set/get状态方法).

__reduce__ docs in pickle。从pathos中看到的错误告诉我,您正在运行到一个用C编写的对象(它有一个__cinit__),因此需要一些额外的方法来告诉pickledill如何保存它的状态。这里可能存在的问题是,您没有创建有问题的对象,而且它来自您正在导入的某个模块。这将导致第3种情况,但是如果没有关于代码的详细信息,我就不能说得更多了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74416483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档