Травление объектов - PullRequest
       20

Травление объектов

0 голосов
/ 05 октября 2010

Мне нужно выбрать объект [объект фрейма 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, «не могу выбрать объекты% s»% base. name TypeError: не может выбрать объекты PySwigObject

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Вы не можете сериализовать виджет для использования в другом процессе.Я предполагаю, что вы хотите изменить содержимое графического интерфейса другого процесса, который запускается модулем 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)
1 голос
/ 05 октября 2010

Я не верю, что объекты wxPython могут быть засолены. Они являются просто обёртками вокруг объектов C, которые содержат множество указателей и других состояний. Модуль рассола не знает о них достаточно, чтобы потом иметь возможность восстановить их состояние.

...