Python多处理中的Pickle cython类

Python多处理中的Pickle cython类,python,python-2.7,pickle,python-multiprocessing,Python,Python 2.7,Pickle,Python Multiprocessing,我有一个用cython实现的类,其中包含c指针,我正试图将其与python的多处理模块一起使用。该类使用DLL文件返回该类的实例 我遇到的问题是,虽然实例保留了它们的数据类型,但它们似乎是空的,也就是说,我可以访问它们的所有类函数,但它们丢失了我在输入之前设置的所有实例值。包含特殊_类的代码非常大,因此我无法包含它 import time import multiprocessing as mp from special_module import special_class def run_

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

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

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_任务中创建实例,它会工作得很好,但我正在寻找一种方法,通过在主进程中创建实例使其工作。这是可能的吗?

我相信多重处理。过程会将所有参数都pickle化。所以您需要告诉Python如何pickle特殊类。您只需要实现方法特殊类。uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果你想让他们成为某类人,你可以:

from special_class import *
(我推荐)或


之所以出现
None
,可能是因为出于某种原因,您在中输入的
m1
m2
方法也接受该模块。我建议尝试从special_class import*中执行

多处理库的工作方式是:先对对象进行酸洗,然后将数据传输到其他派生的进程。问题是您的
特殊类
不可粘贴

如果我在函数run_任务中创建实例,它将正常工作

这是因为这样就不需要对对象进行pickle处理,这可以解决问题


您需要使您的
特殊类可拾取。这可以通过多种方式实现。它们都记录在这里:

基本上有三种机制:

  • 使用定制的泡菜机
  • 特殊类
  • 特殊类
    上实现
    \uuuuuu getstate\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    方法(如果类实例具有状态)

我觉得在
特殊类中有一个对外部对象的引用。在这种情况下,请参阅:

Try。每个windows(OS)
类访问都需要Python上的注册点。您可以访问DLL,但如何设置所有
数据访问过程。需要使用
pythoncom.CoInitialize()
。嗯
import special_class
后跟
m1=special_class(“a.dll”)
是不合法的;你不能调用模块。我假设它在实际代码中略有不同,但无论如何,Cython类定义在这里都很重要;您不能忽略它。不,
None
出现是因为它不能pickle对象。如果我不使用多处理模块,我就不会遇到这个问题。
m1 = special_class.special_class("a.dll")
m2 = special_class.special_class("b.dll")