2011-10-27 88 views
13

我正在使用Python多處理模塊將對象放置到隊列中並讓它們由多個工作人員處理。我的第一個問題是綁定實例方法,我已經工作,但現在我遇到了一個單獨的問題,因爲這些對象使用的是__slots__python多處理pickle協議

當mp模塊去pickle的對象,它似乎是使用舊的ascii pickle協議,不能處理__slots__。較新的協議處理這個,但我不知道如何使mp模塊使用此協議。

任何人都有這方面的經驗?

+0

可以粘貼錯誤消息? – ktdrv

+6

你使用什麼Python和/或多處理模塊版本? 2.7版本看起來像使用HIGHEST_PROTOCOL來酸洗。 – eswald

+0

@eswald:同上。我試圖用我的2.7.1環境複製(徒勞)。 :) – ktdrv

回答

10

如果它不能夠改變多包使用的鹹菜協議,然後定義__getstate____setstate__爲對象:

import pickle 

class Foo(object): 
    __slots__ = ['this', 'that', 'other'] 

    def __init__(self): 
     self.this = 1 
     self.that = 2 
     self.other = 3 

    def __getstate__(self): 
     return dict((name, getattr(self, name)) 
        for name in self.__slots__) 

    def __setstate__(self, state): 
     for name, value in state.items(): 
      setattr(self, name, value) 

pickle.dumps(Foo(), protocol=0) 
+0

淘谷歌之後,我最終選擇了上述解決方案,實現了__getstate__和__setstate__方法。整個情節迫使我學習了許多關於Python的新東西。 – zchtodd