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为每个工人更改文件。

到目前为止,我想出的唯一解决方案是将 a放在函数time.sleep(random.randint(1,100))的开头。run()但是我觉得这个解决方案不是很优雅,并且可能并不总是有效,因为两个工人可能有相同的random.randint,有没有更 Pythonic 的方法来解决这个问题?

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,而不会破坏其他进程。这不一定是最 Pythonic 的方式,但它是最统一的。

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

创建几个目录,每个目录都有一个 mobcal.run,然后在其中运行你的 fortran 程序。

如果您在多处理中需要 sleep() ,那么您做错了。

于 2013-02-01T11:30:57.787 回答