2010-10-05 3 views
0

Мне нужно разжечь объект [объект фрейма wxpython] и отправить его как prameter для этой функции 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. имя TypeError: не солить PySwigObject объекты

+2

я не знаю о засолке прийти, но ErrorMessage hould быть полезным для других помощников. – kasten

ответ

1

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

Это действительно то, что мне очень понравилось – AKM

1

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