2016-02-17 11 views
6

Używam przetwarzania równoległego w Pythonie w systemie Windows. Oto mój kod:python joblib Równolegle w systemie Windows nie działa nawet "jeśli __name__ == '__main__": "dodano

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

oto komunikat:

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

Prawdopodobnie chcesz dodać instrukcję return 'def f (x): return sqrt (x)'. – jotrocken

+0

nie jest tak samo. również czytałem gdzieś, że czasza obsługuje rzeczy inaczej, więc próbuję dodać 'sys.stdout.flush' po' sqrt (x) ', który nie działa ani – YKosinska

+0

Nie, nie jest. Wartością zwracaną jest 'Brak', jeśli nie określisz' return'. – jotrocken

Odpowiedz

7

Według this site Problemem jest to specyficzne dla systemu Windows:

Tak: pod Linuksem jesteśmy rozwidlone, więc ich nie ma trzeba użyć funkcji i działa dobrze. W systemie Windows funkcja musi być dostępna do pobrania, tzn. Musi zostać zaimportowana z innego pliku. To jest właściwie dobra praktyka: wykonanie modułów do ponownego użycia.

Próbowałem twojego kodu i działa bezbłędnie pod Linuksem. W systemie Windows działa OK, jeśli jest uruchamiany ze skryptu, na przykład python script_with_your_code.py. Ale nie powiedzie się, gdy uruchomiono w interaktywnej sesji Pythona. Udało mi się, gdy zapisałem funkcję f w oddzielnym module i zaimportowałem ją do mojej interaktywnej sesji.

NIE DZIAŁA:

Interaktywna sesja:

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


PRACY:
fun.py

from math import sqrt 

def f(x): 
    return sqrt(x) 

Interaktywna sesja:

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

teraz działa! Dziękuję Ci!! – YKosinska

+1

@kchomski nice post. czy wiesz, dlaczego musimy użyć, jeśli __name__ == '__main__' w sesji interaktywnej? czy to konieczne? – WillZ

Powiązane problemy