【发布时间】:2017-04-12 01:51:27
【问题描述】:
我有一个在 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 中创建实例,它会正常工作,但我正在寻找一种通过在主进程中创建实例来使其工作的方法。这可能吗?
【问题讨论】:
-
每个 windows(OS)
class access都需要在 Python 上注册一个点。你访问一个DLL但是如何设置所有data access过程。需要使用pythoncom.CoInitialize()。 check this -
嗯...
import special_class后跟m1 = special_class("a.dll")是不合法的;你不能调用一个模块。我认为它在实际代码中略有不同,但无论哪种方式,Cython 类定义在这里都很重要;你不能省略它。
标签: python python-2.7 pickle python-multiprocessing