0

私は非常に古い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()
4

2 に答える 2

2

a.out現在の作業ディレクトリでそのを探していると思いますmobcal.run。各インスタンスを独自のディレクトリで実行すると、各プロセスは他のプロセスmobcal.runを壊すことなく独自のインスタンスを持つことができます。これは必ずしも最もPython的な方法ではありませんが、最も統一された方法です。

import tempfile
import os

def run(mjf_file):
    dir = tempfile.mkdtemp(dir=".")
    os.chdir(dir)

    # rest of function here
    # create mobcal.run in current directory
    # while changing references to other files from "./" to "../"
于 2013-02-01T11:35:49.720 に答える
1

それぞれ1つのmobcal.runを使用して複数のディレクトリを作成し、代わりにfortranプログラムをそれらに実行します。

マルチプロセッシングでsleep()が必要な場合は、間違っています。

于 2013-02-01T11:30:57.787 に答える