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

Мне нужно замариновать объект [объект кадра 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.имя TypeError: не удается выбрать объекты PySwigObject


person AKM    schedule 05.10.2010    source источник
comment
я не знаю достаточно о травлении, но сообщение об ошибке должно быть полезно для других помощников.   -  person kasten    schedule 05.10.2010


Ответы (2)


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

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

person Alex McBride    schedule 05.10.2010