【问题标题】:Pickling objects酸洗物件
【发布时间】:2010-10-05 09:19:54
【问题描述】:

我需要腌制对象 [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)

谁能告诉我可能是什么问题

如果错误在我得到的最后一条错误消息下方给出了一些指示符: _reduce_ex 中的文件“C:\Python26\lib\copy_reg.py”,第 70 行 raise TypeError, "can't pickle %s objects" % base.name TypeError: can't pickle PySwigObject objects

【问题讨论】:

  • 我对酸洗不太了解,但错误消息应该对其他帮助者有所帮助。

标签: python wxpython pickle


【解决方案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)

【讨论】:

    【解决方案2】:

    我不相信 wxPython 对象可以腌制。它们只是 C 对象的包装器,其中包含大量指针和其他有状态的东西。 pickle 模块对它们的了解不够,无法在之后恢复它们的状态。

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多