我需要pickle对象[wxpython frame object]并将其作为参数发送到multiproccessing池模块上的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)
有人可以告诉我可能是什么问题
如果错误在最后一条错误消息下方给出了一些指示符,我得到: 在_reduce_ex中输入文件“C:\ Python26 \ lib \ copy_reg.py”,第70行 引发TypeError,“不能pickle%s对象”%base。 name TypeError:无法pickle PySwigObject对象
答案 0 :(得分:1)
我不相信wxPython对象可以被腌制。它们只是C对象的包装器,它包含许多指针和其他有状态的东西。泡菜模块对它们知之甚少,以后能够恢复它们的状态。
答案 1 :(得分: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)