对象的序列化

0 投票
2 回答
3656 浏览
提问于 2025-04-16 05:01

我需要把一个对象([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中
raise TypeError, "can't pickle %s objects" % base.name
TypeError: can't pickle PySwigObject objects

2 个回答

1

我觉得wxPython的对象是不能被“腌制”的。它们其实只是C语言对象的外壳,里面包含了很多指针和其他有状态的信息。这个“腌制”模块对它们了解得不够,所以没办法在之后恢复它们的状态。

1

你不能把一个小部件(widget)传递到另一个进程中去使用。我猜你是想通过一个由 multiprocessing 模块启动的进程来改变图形界面的内容。在这种情况下,你应该在父进程中定义一个回调函数,这个函数会在子进程的结果准备好时被调用。因此,你可以使用 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)

撰写回答