Обекти за ецване

Трябва да избера обект [wxpython frame object] и да го изпратя като праметър към тази функция 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)


Не можете да сериализирате приспособление за използване в друг процес. Предполагам, че искате да промените съдържанието на 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)
person AndiDog    schedule 05.10.2010

Не вярвам, че обектите на wxPython могат да бъдат кисели. Те са просто обвивки около C обекти, които съдържат много указатели и други неща за състояние. Модулът pickle не знае достатъчно за тях, за да може след това да възстанови състоянието им.

person Alex McBride    schedule 05.10.2010