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