2016-02-17 30 views
6

WindowsでPythonで並列処理を実行しています。ここに私のコードは次のとおりです。python joblib Windowsでの並列処理でも機能しません "if __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

return文 'def f(x):return sqrt(x)'を追加したいと思うかもしれません。 – jotrocken

+0

それは同じです。また私はキャノピーが異なる処理をするので、 'sqrt(x)'の後に 'sys.stdout.flush'を追加しようとしました。どちらも動作しません。 – YKosinska

+0

いいえ、そうではありません。 'return'を指定しなければ、戻り値は' None'です。 – jotrocken

答えて

7

this siteによると、問題は、Windows固有のものです:

はい:私たちはフォークされているLinuxで、これがない自分です 関数をピクルする必要があり、正常に動作します。ウィンドウの下では、関数は である必要があります。つまり、別のファイルからインポートする必要があります。これは 実際には良い方法です:モジュールを再利用するためにプッシュします。

私はあなたのコードを試してみましたが、Linux上で完璧に動作します。 Windowsでは、python script_with_your_code.pyのようにスクリプトから実行するとOKです。しかし、インタラクティブな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' 


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

関連する問題