私は非常に古いFortranファイルを持っていますが、これは複雑すぎてPythonに変換できません。そのため、ファイルをコンパイルしてPythonで実行する必要があります。
fortranファイルが機能するには、ファイルから3行に3つの入力値が必要mobcal.run
です。それらは次のとおりです。
line 1 - Name of file to run
line 2 - Name of output file
line 3 - random seed number
関数内のワーカーごとの入力値を変更しrun()
ます。スクリプトを実行すると(以下を参照)、2つの出力ファイルしか作成されませんでしたが、top
コマンドで確認した32個のプロセッサーすべてが実行されていました。
mobcal.run
問題はここにあると思いますが、各ワーカーのファイルを変更するのに十分な時間がなかったということです。
私がこれまでに思いついた唯一の解決策は、関数time.sleep(random.randint(1,100))
の先頭にを置くことです。run()
しかし、私はこのソリューションが非常にエレガントであるとは思わず、2人のワーカーが同じrandom.randint
である可能性があるため、常に機能するとは限りません。これを解決するためのよりPython的な方法はありますか?
def run(mfj_file):
import shutil
import random
import subprocess
#shutil.copy('./mfj_files/%s' % mfj_file, './')
print 'Calculating cross sections for: %s' % mfj_file[:-4]
with open('mobcal.run', 'w') as outf:
outf.write(mfj_file+'\n'+mfj_file[:-4]+'.out\n'+str(random.randint(5000000,6000000)))
ccs = subprocess.Popen(['./a.out'])
ccs.wait()
shutil.move('./'+mfj_file[:-4]+'.out', './results/%s.out' % mfj_file[:-4])
def mobcal_multi_cpu():
from multiprocessing import Pool
import os
import shutil
mfj_list = os.listdir('./mfj_files/')
for f in mfj_list:
shutil.copy('./mfj_files/'+f, './')
if __name__ == '__main__':
pool = Pool(processes=32)
pool.map(run,mfj_list)
mobcal_multi_cpu()