Выполнение каждой итерации в цикле for параллельно - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий код:

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

Мой вопрос: как мне запустить команды для всех j параллельно?То есть я хочу, чтобы команды в каждом j выполнялись последовательно, но команды для всех j выполнялись параллельно.Я обнаружил, что можно выполнить

parallel --jobs (number of commands) < (file)

Однако в моем случае это не поможет, поскольку я хочу, чтобы команды, вложенные во второй цикл for, выполнялись последовательно.Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
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[@]}"
0 голосов
/ 08 ноября 2018

Не на подходящем компьютере, но:

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