2012-03-12 29 views
6

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

Windows पर, तथापि, चीजों के रूप में सुचारू रूप से संचालित नहीं है:

* [INFO] Parsing 1 file using 2 threads 

Traceback (most recent call last): 
    File "main.py", line 170, in <module> 
    master = ParsingMaster(parser, list(input_file), output_list, threads=num_threads) 
Traceback (most recent call last): 
    File "main.py", line 39, in __init__ 
    File "<string>", line 1, in <module> 
    self.input_process.start() 
    File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main 
    File "C:\Python26\lib\multiprocessing\process.py", line 104, in start 
     self._popen = Popen(self) 
self = load(from_parent) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__ 
    File "C:\Python26\lib\pickle.py", line 1370, in load 
    dump(process_obj, to_child, HIGHEST_PROTOCOL) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump 
    ForkingPickler(file, protocol).dump(obj) 
    File "C:\Python26\lib\pickle.py", line 224, in dump 
    return Unpickler(file).load() 
    self.save(obj) 
File "C:\Python26\lib\pickle.py", line 858, in load 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    dispatch[key](self) 
    File "C:\Python26\lib\pickle.py", line 880, in load_eof 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    r aise EOFError 
File "C:\Python26\lib\pickle.py", line 649, in save_dict 
EOFError 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\multiprocessing\forking.py", line 40, in dispatcher 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 548, in save_tuple 
    save(element) 
    File "C:\Python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python26\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python26\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python26\lib\pickle.py", line 306, in save 
    rv = reduce(self.proto) 
    File "C:\Python26\lib\multiprocessing\managers.py", line 458, in __reduce__ 
    return type(self).from_address, \ 
AttributeError: type object 'SyncManager' has no attribute 'from_address' 

मैं विंडोज 7 पर दोनों अजगर 2.6 और 2.7 पर परीक्षण कर रहा हूँ और अधिक से अधिक यह एक ही त्रुटि मिलती है। क्या किसी को पता है इसका क्या अर्थ है?

+1

क्या आपने [प्लेटफ़ॉर्म-विशिष्ट दस्तावेज़] (http://docs.python.org/library/multiprocessing.html#windows) पढ़ा था, विशेष रूप से पहला प्रतिबंध? –

+0

धन्यवाद, मैंने अभी किया। मैं केवल संपूर्ण वर्ग के लिए तर्क के रूप में सूचियों का उपयोग कर रहा हूं, इसलिए कोई भी पिकलिंग त्रुटियां नहीं होनी चाहिए। मैं या तो प्रक्रिया subclassing नहीं कर रहा हूँ। – Blender

उत्तर

7

विंडोज पर प्रतिबंध रहे हैं, यहाँ त्रुटियों आप देख रहे हैं के लिए प्रासंगिक भागों है:

Since Windows lacks os.fork() it has a few extra restrictions:

अधिक picklability

सुनिश्चित करें कि Process.__init__() के सभी तर्कों picklable हैं। यह का अर्थ है, विशेष रूप से, उस बाध्य या अनबाउंड विधियों का उपयोग को सीधे विंडोज़ पर लक्षित तर्क के रूप में नहीं किया जा सकता है - बस फ़ंक्शन को परिभाषित करें और इसके बजाय इसका उपयोग करें।

इसके अलावा, यदि आप Process उपclass करते हैं तो सुनिश्चित करें कि उदाहरण पिक्सेल करने योग्य होंगे जब Process.start() विधि कहा जाता है।

यह है कि कुछ है कि Process.__init__()isn't able to be pickled or unpickled (पायथन में एक क्रमबद्धता) के लिए एक तर्क के रूप में पारित किया जा रहा है इसका मतलब है। SyncManager क्या है यह उस वस्तु पर गुणों को खोजने में सक्षम नहीं होने के बारे में शिकायत कर रहा है AttributeError: type object 'SyncManager' has no attribute 'from_address', यह शायद आपका मूल कारण है। क्या SyncManager ऑब्जेक्ट वास्तव में मसालेदार हो सकता है, does it meet the pickle rules?

यदि आप इसे command line on Windows, you can't do that से स्पष्ट रूप से चला रहे हैं।

ऐसा मत करो। कोड को फ़ाइल में सहेजें और इसके बजाए फ़ाइल से इसे चलाएं, कमांड के साथ:

python myfile.py 

इससे आपकी समस्या हल हो जाएगी।

+0

मैंने बस इसे पढ़ा, धन्यवाद। क्या आपको पता है कि इसका क्या मतलब है? मैं केवल संपूर्ण वर्ग के लिए तर्क के रूप में सूचियों का उपयोग कर रहा हूं, इसलिए कोई भी पिकलिंग त्रुटियां नहीं होनी चाहिए। मैं या तो 'प्रक्रिया' subclassing नहीं कर रहा हूँ। – Blender

+0

मैं विंडोज कमांड लाइन के माध्यम से फ़ाइल चला रहा हूँ। 'SyncManager' के लिए, मैंने इसे कभी परिभाषित नहीं किया। जहां तक ​​मैं कह सकता हूं कि यह 'मल्टीप्रोसेसिंग' का हिस्सा है। – Blender

+0

आप इसे इंटरैक्टिव कंसोल में नहीं चला सकते हैं, लेकिन कमांड लाइन में 'python abc.py' टाइप करके स्क्रिप्ट चलाकर बस ठीक काम करता है। – Dikei

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