2016-02-17 21 views
6

Sto eseguendo l'elaborazione parallela in Python su Windows. Ecco il mio codice:python joblib Parallel su Windows non funziona nemmeno "se __name__ == '__main__':" è aggiunto

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

Ecco il messaggio di errore:

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

Probabilmente vorrete aggiungere un'istruzione return 'def f (x): return sqrt (x)'. – jotrocken

+0

no è lo stesso. inoltre ho letto da qualche parte che il baldacchino gestisce le cose in modo diverso, quindi provo ad aggiungere 'sys.stdout.flush' dopo' sqrt (x) ', che non funziona o – YKosinska

+0

No, non lo è. Il valore restituito è 'None', se non si specifica' return'. – jotrocken

risposta

7

Secondo this site il problema è Windows specifica:

Sì: sotto Linux che stiamo forking, quindi loro non è necessità di decollare la funzione e funziona correttamente. Sotto Windows, la funzione deve essere selezionabile, cioè deve essere importata da un altro file. Questo è in realtà una buona pratica: fare push dei moduli per il riutilizzo.

Ho provato il codice e funziona perfettamente sotto Linux. In Windows viene eseguito correttamente se viene eseguito da uno script, ad esempio python script_with_your_code.py. Ma fallisce quando viene eseguito in una sessione python interattiva. Ha funzionato per me quando ho salvato la funzione f in un modulo separato e l'ho importata nella mia sessione interattiva.

NON LAVORO: sessione

Interactive:

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


LAVORO:
fun.py sessione

from math import sqrt 

def f(x): 
    return sqrt(x) 

Interactive:

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

ora funziona! grazie!! – YKosinska

+1

@kchomski bel post. sai perché dobbiamo usare __name__ == '__main__' in una sessione interattiva? è necessario? – WillZ