在for循环中并行运行每个迭代

时间:2018-11-08 06:07:31

标签: shell parallel-processing gnu-parallel

我有以下代码:

from eh.models import ExerciseCardio, Exercise, ExerciseWeights


c = ExerciseCardio.objects.create(name="Cardio!")
w = ExerciseWeights.objects.create(name="Weights!")

print(Exercise.objects.filter(name="Cardio!").select_subclasses().get())
# Cardio! (<class 'eh.models.ExerciseCardio'>)

for e in Exercise.objects.all().select_subclasses():
    print(e)
# Cardio! (<class 'eh.models.ExerciseCardio'>)
# Weights! (<class 'eh.models.ExerciseWeights'>)

我的问题是如何并行运行所有j的命令? 也就是说,我希望每个j中的命令顺序运行,但所有j的命令并行运行。 我发现一个人可以做

for i in "${atomic_mass[@]}"
do
        cd /home/eric2207/data/Z=66
        mkdir DY"$i"
        for j in "${deformation[@]}"
        do
                cd /home/eric2207/DRHBc
                make clean
                sed -e "s/\${A}/$i/" -e "s/\${beta}/$j/" $input > $output
                make
                cd /home/eric2207/data/Z=66/DY"$i"
                mkdir ./"$j"
                cd ./"$j"
                cp /home/eric2207/DRHBc/1drhbws .
                cp /home/eric2207/DRHBc/dir.dat .
                cp /home/eric2207/DRHBc/paramet.for .
        done
done

但是,这对于我的情况没有帮助,因为我希望嵌套在第二个for循环中的命令按顺序运行。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

不是在正确的计算机上,而是:

for
do
   ...
   for 
   do
      (
        ...
        ...
      ) &
   done
   wait
done

答案 1 :(得分:0)

do_one() {
  i="$1"
  j="$2"
  jobslot="$3"
  cd /home/eric2207/data/Z=66
  mkdir -p DY"$i"
            cd /home/eric2207/
            # You need a new dir per combination due to race condition
            rsync -a DRHBc/ DRHBc-"$jobslot"/
            cd DRHBc-"$jobslot"
            make clean
            sed -e "s/\${A}/$i/" -e "s/\${beta}/$j/" $input > $output
            make
            cd /home/eric2207/data/Z=66/DY"$i"
            mkdir ./"$j"
            cd ./"$j"
            cp /home/eric2207/DRHBc-"$jobslot"/1drhbws .
            cp /home/eric2207/DRHBc-"$jobslot"/dir.dat .
            cp /home/eric2207/DRHBc-"$jobslot"/paramet.for .
}
export -f do_one
parallel do_one {1} {2} {%} ::: "${atomic_mass[@]}" ::: "${deformation[@]}"

强制串行执行外部循环:

inner() {
  i="$1"
  parallel -q do_one "$i" {1} {%} ::: "${deformation[@]}"
}
export -f inner
env_parallel --env deformation -j1 inner ,,, "${atomic_mass[@]}"