我有一个非常旧的 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()