Python で multiprocessing モジュールを使用して、一連のジョブをできるだけ多くのコアにマップしています。私がラップしているジョブは、ほとんどの場合、ラップされた fortran コード (f2py でラップ) で実行されます。ジョブのみを呼び出すと、すべてのコアを使用して問題なく処理されます。ただし、最初Pool().map()
に (関数を介さずに) fortran ライブラリを個別に呼び出そうとすると、次にマップを呼び出すと、プログラム全体がハングします (知りたい場合は、threading.py の 339 行目で正確にハングします。コードは) です。waiter.acquire()
私が書いているプログラムでは、ライブラリを呼び出してマップする前にライブラリを呼び出す必要があります。最初に単一のプロセスを使用して呼び出すことでこれを回避しましたPool().map()
が、これはハックであり、なぜこれをしなければならないのか知りたいです!
より明確にするために、これは機能しません。
def call_camb_transfer(H0): #wraps the call to define the keyword parameter to pass
return pycamb.transfers(H0=H0)[1][6, :, 0]
b = call_camb_transfer(70)
pool = multiprocessing.Pool(2)
H0 = [60, 70]
results = pool.map(call_camb_transfer, H0)
しかし、これは:
def call_camb_transfer(H0): #wraps the call to define the keyword parameter to pass
return pycamb.transfers(H0=H0)[1][6, :, 0]
initial_pool = multiprocessing.Pool(1)
b = initial_pool.map(call_camb_transfer, [65.0])
pool = multiprocessing.Pool(2)
H0 = [60, 70]
results = pool.map(call_camb_transfer, H0)
は、Fortran ライブラリでpycamb
ある CAMB の python ラッパーです。