сделать петлю параллельной

Как сделать этот цикл параллельным:

for a in $(seq 1 3) do for b in 0.1 0.2 do echo process with a=$a and b=$b & done done 

это параллельно или нет? На самом деле, я хочу запустить echo process with a=$a and b=$b параллельно для каждой комбинации значений a и b Вот результат запуска указанной оболочки:

 process with a=1 and b=0.1 process with a=2 and b=0.2 process with a=2 and b=0.1 process with a=3 and b=0.2 process with a=3 and b=0.1 process with a=1 and b=0.2 

Благодарю.

  • возможность параллельной сборки приложения
  • Как запустить Abinit через MPI?
  • не может создать обычный файл 'filename': Файл существует
  • Существует ли простой способ ограничения числа дочерних процессов, выполняемых параллельно?
  • Принуждение GNU make для запуска команд в порядке
  • Какая опция dirsync для монтирования?
  • Удаление номеров из имен файлов
  • Как запускать несколько скриптов параллельно
  • 3 Solutions collect form web for “сделать петлю параллельной”

    С GNU Parallel это выглядит так:

     parallel echo process with a={1} and b={2} ::: 1 2 3 ::: 0.1 0.2 seq 1 3 | parallel echo process with a={1} and b={2} :::: - ::: 0.1 parallel echo process with a={1} and b={2} :::: <(seq 1 3) ::: 0.1 0.2 

    Я предполагаю, что echo является просто примером, поскольку параллелизующее echo вряд ли стоит того.

    Если вещь, которую вы запускаете во внутреннем цикле, занимает какое-то время ( echo очень быстро запускается), тогда, когда петли запустили все асинхронные процессы, они будут работать одновременно .

    Сами петли не являются «параллельными».

    Это должно быть комментарий, но комментарии слишком малы.

    Убедитесь, что ваше решение работает для вывода произвольных размеров и не смешивает выходные данные из одного задания с другим. Вот небольшой пример, чтобы проверить, что:

     #!/bin/bash # stress test of parallelizing programs longline() { # print one big line with 'a's followed by 'b's followed by 'c's perl -e 'print "@ARGV ", map { "$_"x10000000 } (a..c)' "$@" echo } echo "Run testprogram in parallel" for a in $(seq 1 3) do for b in 0.1 0.2 do longline $a $b & done done | # use 'tr' to compress many 'a's into a single 'a' # if the output is not 'abc' on every line, lines have been mixed tr -cs '@' echo "Run testprogram in serial" for a in $(seq 1 3) do for b in 0.1 0.2 do longline $a $b done done | tr -cs '@' echo "Compare with GNU Parallel" export -f longline parallel -kj0 longline :::: <(seq 1 3) ::: 0.1 0.2 | tr -cs '@' 
    Linux и Unix - лучшая ОС в мире.