2010-10-05 61 views
0

我需要pickle对象[wxpython框架对象]并将其作为参数发送给此函数apply_async在多处理池模块 有人可以提供一个示例我该如何做 我试过以下并得到一个错误消息:酸洗对象

myfile = file(r"C:\binary.dat", "w") 
pickle.dump(self, myfile) 
myfile.close() 


self.my_pool.apply_async(fun,[i,myfile]) 

def fun(i,self_object): 
    window = pickle.load(self_oject) 
    wx.CallAfter(window.LogData, msg) 

可能有人告诉我可能是什么问题

如果错误给出的最后一条错误消息下面的一些指标,我得到: 文件“C:\ Python26 \ LIB \ copy_reg.py” ,第70行,在_reduce_ex中 引发TypeError,“can” t pickle%s对象“%base。 name TypeError:不能泡菜PySwigObject对象

+2

我不知道足够多关于酸洗但errormessage的HOULD是其他助手的帮助。 – kasten 2010-10-05 09:21:29

回答

1

您无法序列化一个小部件以用于其他进程。我想你想更改由multiprocessing模块启动的另一个进程的GUI内容。在这种情况下,你应该在父进程中定义一个回调函数,当子进程的结果准备就绪时被调用。因此,您可以使用apply_async的“回调”参数。

喜欢的东西:

def fun(i): 
    # do something in this sub-process and then return a log message 
    return "finished doing something" 

def cb(resultFromFun): 
    wx.CallAfter(window.LogData, resultFromFun) 

my_pool.apply_async(fun, [i], callback = cb) 
+0

这真的是我非常感谢的 – AKM 2010-10-05 12:20:45

1

我不认为wxPython对象会被酸洗。它们只是围绕着C对象的包装器,它包含许多指针和其他有状态的东西。泡菜模块并不知道他们能够在事后恢复状态。