6

जोड़ा गया है, मैं विंडोज़ पर पायथन में समांतर प्रसंस्करण चला रहा हूं।पायथन जॉबलिब विंडोज पर समानांतर भी काम नहीं कर रहा है "अगर __name__ == '__main__':"

from joblib import Parallel, delayed 

def f(x): 
    return sqrt(x) 

if __name__ == '__main__': 
    a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10)) 

यहाँ त्रुटि संदेश है: यहाँ मेरी कोड है

Process PoolWorker-2: 
Process PoolWorker-1: 
Traceback (most recent call last):  
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\process.py", line 258, in _bootstrap 
self.run() 
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\process.py", line 114, in run 
self._target(*self._args, **self._kwargs) 
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.4.3105.win-x86_64\lib\multiprocessing\pool.py", line 102, in worker 
task = get() 
File "C:\Users\yoyo__000.BIGBLACK\AppData\Local\Enthought\Canopy\User\lib\site-packages\joblib\pool.py", line 363, in get 
return recv() 
AttributeError: 'module' object has no attribute 'f' 
+0

आप शायद एक रिटर्न स्टेटमेंट 'डीफ़ एफ (एक्स) जोड़ना चाहते हैं: वापसी sqrt (x) '। – jotrocken

+0

नहीं, यह वही है। मैंने कहीं भी पढ़ा है कि चंदवा चीजों को अलग-अलग संभालता है इसलिए मैं 'sqrt (x) 'के बाद' sys.stdout.flush' जोड़ने का प्रयास करता हूं, जो – YKosinska

+0

नहीं काम करता है, नहीं। यदि आप 'वापसी' निर्दिष्ट नहीं करते हैं तो वापसी मूल्य 'कोई नहीं' है। – jotrocken

उत्तर

7

this site समस्या के अनुसार विंडोज विशिष्ट है:

हाँ: लिनक्स के तहत हम forking कर रहे हैं, इस प्रकार उनके कोई फ़ंक्शन को अचार करने की आवश्यकता है, और यह ठीक काम करता है। विंडोज़ के तहत, फ़ंक्शन को पिकलेबल होना चाहिए, यानी इसे किसी अन्य फ़ाइल से आयात करने की आवश्यकता है। यह वास्तव में अच्छा अभ्यास है: मॉड्यूल को पुन: उपयोग के लिए धक्का देता है।

मैंने आपके कोड की कोशिश की है और यह लिनक्स के तहत बेकार ढंग से काम करता है। विंडोज के तहत यह ठीक है अगर यह किसी स्क्रिप्ट से चलाया जाता है, जैसे python script_with_your_code.py। लेकिन यह एक इंटरैक्टिव पायथन सत्र में भागने में विफल रहता है। यह मेरे लिए काम करता है जब मैंने अलग मॉड्यूल में f फ़ंक्शन को सहेजा और इसे मेरे इंटरैक्टिव सत्र में आयात किया।

नहीं काम:

इंटरएक्टिव सत्र:

>>> from math import sqrt 
>>> from joblib import Parallel, delayed 

>>> def f(x): 
...  return sqrt(x) 

>>> if __name__ == '__main__': 
...  a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10)) 
... 
Process PoolWorker-1: 
Traceback (most recent call last): 
    File "C:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Python27\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Python27\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Python27\lib\site-packages\joblib\pool.py", line 359, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'f' 


श्रमजीवी:
fun.py

from math import sqrt 

def f(x): 
    return sqrt(x) 

इंटरएक्टिव सत्र:

>>> from joblib import Parallel, delayed 
>>> from fun import f 

>>> if __name__ == '__main__': 
...  a = Parallel(n_jobs=2)(delayed(f)(i) for i in range(10)) 
... 
>>> a 
[0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3.0] 
+0

अब यह काम करता है! धन्यवाद!! – YKosinska

+1

@kchomski अच्छी पोस्ट। क्या आपको पता है कि हमें एक इंटरैक्टिव सत्र में __name__ == '__main__' का उपयोग करने की आवश्यकता क्यों है? क्या ये ज़रूरी हैं? – WillZ

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