вопрос о многоядерных командах CLI

вопрос о многоядерных командах CLI

У меня есть набор из 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

Монтаж

Если 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

Связанный контент