
У меня есть набор из 150 команд CLI для выполнения в файле на моей 12-ядерной машине. Запуск всех 150 задач в фоновом режиме тормозит систему, и я обнаружил на собственном опыте, что оптимальным вариантом является запуск 12-18 задач.
Раньше я просто разделял 150 команд на пакетные файлы по 12 или 13 частей, используя команду split, а затем запускал каждую из них. Однако некоторые пакетные файлы завершались раньше других, и в итоге я получал 3 или 4 пакетных файла, которые завершались намного дольше других, в то время как остальные 9 или 8 ядер простаивали.
Моя цель — поддерживать работу всех 12 ядер до тех пор, пока не будут выполнены все 150 команд CLI.
Возможно ли, чтобы каждый процессор захватывал одну задачу из списка команд CLI из 150, отмечал эту команду как выполняемую и позволял другим 11 процессорам захватывать свой собственный элемент, пока все 150 не будут выполнены, без того, чтобы процессоры спотыкались друг о друга и захватывали одну и ту же команду CLI? Записи в файл должны быть уникальными.
Есть ли какой-нибудь простой способ сделать это?
решение1
С использованием GNU Parallel это выглядит так:
cat 150commands.txt | parallel
Он будет выполнять одну задачу на ядро.
GNU Parallel — это общий распараллеливатель, который позволяет легко запускать задания параллельно на одной машине или на нескольких машинах, к которым у вас есть доступ по ssh. Часто он может заменить цикл for
.
Если у вас есть 32 различных задания, которые вы хотите запустить на 4 ЦП, то прямой способ распараллеливания — запустить 8 заданий на каждом ЦП:
Вместо этого GNU Parallel запускает новый процесс после завершения предыдущего, сохраняя при этом активными ЦП и, таким образом, экономя время:
Монтаж
Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить персональную установку, которая не требует доступа root. Это можно сделать за 10 секунд, выполнив следующее:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Другие варианты установки см.http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Узнать больше
Смотрите больше примеров:http://www.gnu.org/software/parallel/man.html
Посмотрите вступительные видеоролики:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Пройдите обучение:http://www.gnu.org/software/parallel/parallel_tutorial.html
Подпишитесь на рассылку, чтобы получить поддержку:https://lists.gnu.org/mailman/listinfo/parallel