コマンドラインから呼び出すことができる関数で並列処理を機能させようとして問題が発生しています。関数は Web サイトからデータをダウンロードし、何らかの処理を行ってデータをディスクに保存するため、マルチプロセッシングは明らかなソリューションのように思われました。ただし、関数を実行しようとすると、アイドル状態の python プロセスが作成されてフリーズし、何が間違っているのかわかりません。現在、私は64ビットのWindows 7とjoblibでpython 2.7(64ビット)を使用してタスクを実行しています。
問題を再現する単純化されたコードを次に示します。
import os,numpy as np
from joblib import Parallel, delayed
def foo(stations,wdir,multiprocess):
if multiprocess==False:
for a in stations:
writefoo(wdir,a)
if multiprocess==True:
Parallel(n_jobs=len(stations))(delayed(writefoo)(wdir,station) for station in stations)
def writefoo(wdir,station):
os.makedirs(os.path.join(wdir,station[0]))
np.save(os.path.join(wdir,station[0],station[0]),station[1])
def go(multiprocess):
stations=[['ST1',np.random.rand(1,1000).flatten()],['ST2',
np.random.rand(1,1000).flatten()],['ST3',np.random.rand(1,1000).flatten()]]
wdir=os.getcwd()
foo(stations,wdir,multiprocess)
ipython コンソールから go(True) と入力すると、% cpu とほぼ同じ量のメモリ (16 mb) を使用しない 3 つの新しい python プロセスが作成されますが、ファイルは作成されず、それらを強制終了するまで待機します。
go(False) を実行すると、関数の実行に数ミリ秒しかかからず、期待どおりに動作しますが、並列ではなく順次に動作します。ここで何が間違っていますか?注: コードはモジュールで使用されるため、スクリプト自体を実行するのではなく、コマンド ラインからプロセス全体を呼び出せることが重要です。