gpt4 book ai didi

python - Python 多处理中的 Pickle cython 类

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:55 25 4
gpt4 key购买 nike

我有一个用 cython 实现的类,其中包含我试图与 python 的多处理模块一起使用的 c 指针。该类采用 DLL 文件返回该类的实例。

我遇到的问题是,虽然实例保留了它们的数据类型,但它们似乎是空的,即我可以访问它们的所有类函数,但它们丢失了我在它们进入之前设置的所有实例值。包含 special_class 的代码非常大,所以我无法包含它。

import time
import multiprocessing as mp
from special_module import special_class

def run_task(tasks,nr):
obj = tasks[nr]['data']
print obj.get_name()



if __name__ == "__main__":

m1 = special_class("a.dll")
m2 = special_class("b.dll")


tasks = dict()

tasks[1] = {'data': m1}
tasks[2] = {'data': m2}


process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1))
process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2))

process1.start()

time.sleep(0.2)

process2.start()

process1.join()
process2.join()

上面的脚本给了我输出

None
None

正确的输出应该是

的样式
name.a
name.b

如果我在函数 run_task 中创建实例,它将正常工作,但我正在寻找一种通过在主进程中创建实例来使其工作的方法。这可能吗?

最佳答案

多处理库的工作原理是对对象进行 pickle ,然后将数据通过管道传输到其他生成的进程。问题是您的 special_class 是不可 pickle 的。

If I create the instances inside the function run_task it will work fine

这是可行的,因为这样就不需要对对象进行 pickle,从而解决了这个问题。


您需要使您的 special_class 可挑选。这可以通过多种方式完成。它们都记录在此处:https://docs.python.org/3/library/pickle.html#pickle-inst

基本上,有3种机制:

  • 使用自定义 pickler
  • special_class 上实现一个 __reduce__ 方法
  • special_class 上实现 __getstate____setstate__ 方法(如果您的类实例有状态)

我感觉您在special_class 中引用了一个外部对象。在这种情况下,请参阅:https://docs.python.org/3/library/pickle.html#persistence-of-external-objects

关于python - Python 多处理中的 Pickle cython 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com