6

Я выполняю параллельную обработку в Python в Windows. Вот мой код:python joblib Параллельно в Windows не работает даже «если __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

Возможно, вам захочется добавить оператор возврата 'def f (x): return sqrt (x)'. – jotrocken

+0

нет. также я читал где-то, что купол обрабатывает вещи по-другому, поэтому я пытаюсь добавить 'sys.stdout.flush' после' sqrt (x) ', который не работает ни – YKosinska

+0

Нет, это не так. Возвращаемое значение - 'None', если вы не укажете' return'. – jotrocken

ответ

7

Согласно this site проблема не является Windows, конкретны:

Да: под Linux мы разветвление, таким образом, их нет необходимо разжечь функцию , и она отлично работает. Под окнами функция должна быть pickleable, то есть ее необходимо импортировать из другого файла. Это Фактически хорошая практика: создание модулей толкает для повторного использования.

Я пробовал свой код и работает безупречно под Linux. В Windows он работает нормально, если он запущен из сценария, например python script_with_your_code.py. Но это не удается при запуске в интерактивном сеансе python. Он работал для меня, когда я сохранил функцию 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

Смежные вопросы