Блог #параллельное выполнение

Тайланд, Индонезия, Сингапур (зима 2010). В Сингапурском зоопарке. Лемуры
Исландия 2023.
Март 2017. Берлин — Роттердам — Дюссельдорф. Дюссельдорф
Хорватия, Млини 2017. Вид на море
Берлин, Люббенау, Потсдам. Май 2018. Вид в парке
Новый Год 2009 (Амстердам). Еще чайки
Хорватия, Млини 2017. ПАцаны играют в футбол в старом Дубровнике
Тайланд, Индонезия, Сингапур (зима 2010). Джакарта. Знак
Ирландия, март 2015. Стадион
Хорватия, Млини 2017. Лестница
Март 2017. Берлин — Роттердам — Дюссельдорф. Дюссельдорф
Хорватия, Млини 2017. Старый Дубровник
Весна 2012. Германия — Франция — Италия. В горах возле Сен-Тропе
Тайланд, Индонезия, Сингапур (зима 2010). Собака
Ирландия, март 2015. Океан
Тайланд, Индонезия, Сингапур (зима 2010). В Сингапурском зоопарке. Древняя индийская (индейская?) поговорка
Весна 2012. Германия — Франция — Италия. Деревня возле Ла Специи
Байкал, остров Ольхон, Хужир. Март 2018. Велосипедист
Новый год 2008 (Норвегия, Швеция, Дания). забор из старых лыж
Лето 2008 (Куба). Вид из окна всего за 220 баксов в день
Март 2017. Берлин — Роттердам — Дюссельдорф. Помидорки
Новый Год 2009 (Амстердам). Музей пива
Новый Год 2009 (Амстердам). Крутая лестница
Гармиш-Партенкирхен, Миттенвальд, Инсбрук. Май-июнь 2022. Путь к панорамному мосту в Миттенвальде
Ирландия, март 2015. Дорога
Берлин 2023. Ольчун
Хорватия, Млини 2017. Паутина
Гармиш-Партенкирхен, Миттенвальд, Инсбрук. Май-июнь 2022. Миттенвальд
Весна 2012. Германия — Франция — Италия. Люксембург. Я и Альфа-Ромео Джульетта
Первый Россиийский семинар по CMS Drupal. GogA и Dan
Прага, май 2017. Радуга в саду возле Пражского града

GNU parallel и xargs. Параллельный запуск нескольких копий команды с разными аргументами

Задача

GNU Parallel

Есть консольная команда вида:

./do-something.sh -x 1

Значение аргумента x может меняться в диапазоне от 1 до 30 000. Выполнение команды для одного аргумента занимает от 30 секунд до 15 минут. Нужно максимально быстро выполнить эту команду для заданного диапазона аргументов на N-ядерном сервере максимально используя ресурсы сервера.

Возможные варианты решения

  1. Простой цикл от 1 до 30 тысяч с запуском команды на каждой итерации будет использовать только 1 ядро. Это решение неприемлемо: оно будет работать слишком долго и не задействует все доступные ресурсы сервера.
  2. Можно вручную разбить диапазон на N частей и запустить N циклов вида:
   for i in `seq 1 1000`
   do
    ./do-something.sh -x $i
   done

Второе решение лучше первого — оно задействует все доступные ядра процессора, но оно все равно неприемлемо. Команды выполняются с непостоянной скоростью. В каком-то из диапазонов могут попасться только легкие команды, которые выполнятся, предположим, за несколько минут, а в каком-то — тяжелые и их выполнение затянется на несколько часов. Таким образом, часть ядер быстро освободится, будет простаивать и ресурсы сервера опять будут использованы неоптимально.

Читать дальше ➠