2016-02-17 13 views
6

Windows üzerinde Python'da paralel işlem yapıyorum. İştepython joblib Windows üzerinde Paralel bile çalışmıyor "if" __name__ == '__main__': "eklenir

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)) 

hata mesajı var: İşte benim kod this site sorun göre

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

Muhtemelen bir geri dönüş ifadesi 'def f (x): return sqrt (x)' eklemek istersiniz. – jotrocken

+0

Hayır, aynı. Ayrıca bir şey okuyor gölgelik şeyler farklı bir şekilde yani 'sys.stdout.flush'' sqrt (x) 'sonra eklemek için çalışıyorum, hangi işe yaramıyor – YKosinska

+0

Hayır, değil. Dönüş değerini belirtmezseniz, dönüş değeri "Yok" şeklindedir. – jotrocken

cevap

7

, Windows özgüdür: Evet

: linux altında biz forking edilir, böylece artık onların işlevini seçmeniz gerekiyor ve iyi çalışıyor. Pencerelerin altında, fonksiyonun seçilebilir olması, yani başka bir dosyadan içe aktarılması gerekir. Bu aslında iyi bir uygulama: modülleri tekrar kullanmaya itiyor.

Kodunuzu denedim ve Linux altında kusursuz çalışıyor. Windows altında, python script_with_your_code.py gibi bir komut dosyasından çalıştırılıyorsa Tamam'ı çalıştırır. Ancak etkileşimli bir python oturumunda çalıştırıldığında başarısız olur. f işlevini ayrı bir modülde kaydettiğimde ve etkileşimli oturumuma aktardığımda benim için çalıştı.

ÇALIŞMIYOR:

Etkileşimli oturum:

>>> 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' 


ÇALIŞMA:
fun.py

from math import sqrt 

def f(x): 
    return sqrt(x) 

Etkileşimli oturum:

>>> 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

şimdi çalışıyor! teşekkür ederim!! – YKosinska

+1

@kchomski güzel yazı. etkileşimli bir oturumda __name__ == '__main__' ise neden kullanmamız gerektiğini biliyor musunuz? bu gerekli? – WillZ

İlgili konular