2011-10-27 19 views
13

मैं पाइथन मल्टीप्रोसेसिंग मॉड्यूल का उपयोग क्यूब्स पर ऑब्जेक्ट्स रखने के लिए कर रहा हूं और उन्हें कई श्रमिकों द्वारा संसाधित किया गया है। मेरा पहला मुद्दा अचार के लिए बाध्य उदाहरण विधियों को प्राप्त कर रहा था, जो मैं काम कर रहा हूं, लेकिन अब मैं इस तथ्य के कारण एक अलग मुद्दे में भाग रहा हूं कि ऑब्जेक्ट __slots__ का उपयोग कर रहे हैं।पायथन मल्टीप्रोसेसिंग अचार प्रोटोकॉल

जब एमपी मॉड्यूल ऑब्जेक्ट्स को अचार करने के लिए जाता है, तो ऐसा लगता है कि यह पुराने एसीसी पिकल प्रोटोकॉल का उपयोग कर रहा है, जो __slots__ को संभाल नहीं सकता है। नया प्रोटोकॉल इसे संभालता है, लेकिन मुझे यकीन नहीं है कि एमपी मॉड्यूल इस प्रोटोकॉल का उपयोग कैसे करें।

किसी के पास इसका कोई अनुभव है?

+0

आपको त्रुटि संदेश पेस्ट कर सकते हैं? – ktdrv

+6

क्या पाइथन और/या म्यूटिप्रोसेसिंग मॉड्यूल संस्करण आप उपयोग कर रहे हैं? संस्करण 2.7 ऐसा लगता है कि यह pickling के लिए 'HIGHEST_PROTOCOL' का उपयोग करता है। – eswald

+0

@eswald: Ditto। मैं अपने 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

Google को खराब करने के बाद, मैं उपरोक्त समाधान के साथ जा रहा हूं, __getstate__ और __setstate__ विधियों को लागू करता हूं। इस पूरे एपिसोड ने मुझे सामान्य रूप से पाइथन के बारे में कई नई बातें सीखने के लिए मजबूर किया। – zchtodd

संबंधित मुद्दे