Скажем, у меня есть большое количество заданий (десятки или сотни), которые нужно выполнять, но они требуют значительных ресурсов процессора и только несколько из них могут быть запущены одновременно. Есть ли простой способ запустить X
работу сразу и начать новую после ее завершения? Единственное, что я могу придумать, это что-то вроде ниже (псевдокод):
jobs=(...);
MAX_JOBS=4;
cur_jobs=0;
pids=(); # hash/associative array
while (jobs); do
while (cur_jobs < MAX_JOBS); do
pop and spawn job and store PID and anything else needed;
cur_jobs++;
done
sleep 5;
for each PID:
if no longer active; then
remove PID;
cur_jobs--;
done
Я чувствую, что слишком усложняю решение, как я часто это делаю. Целевой системой является FreeBSD, если может быть какой-то порт, который выполняет всю тяжелую работу, но предпочтительным является универсальное решение или общая идиома.
scripting
process
freebsd
parallelism
Джейсон Лефлер
источник
источник
make -f 4
4 параллельных задания.Ответы:
Если у вас есть GNU Parallel, вы можете сделать это:
GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.
Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:
GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая процессоры активными и, таким образом, экономя время:
Монтаж
Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:
Для других вариантов установки см. 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
источник
Можно, но это сложно и хрупко. Есть несколько вариантов, один из них есть
xargs
.Проблемы, возникающие при использовании контроля работы и сигналов, обсуждаются в этой интересной статье, действительно рекомендуется прочитать:
http://prll.sourceforge.net/shell_parallel.html
Парень, очевидно, создал новый инструмент,
prll
который может принимать произвольные функции оболочки для параллельного выполнения (с автоматически определяемым или определяемым пользователем размером пула), который использует процесс управления, который синхронизирует все ввод и вывод.Проверьте это здесь: https://gitorious.org/prll/pages/Home
источник
У меня была точно такая же ситуация, как и у вас, но задания, которые мне нужно выполнять параллельно, это команды, которые запускают скрипты ruby. Во-первых, я должен признать, что он не идеален, а хрупок.
То, что я сделал в своем коде ruby, было:
Затем в цикле while я периодически проверяю количество процессов, а затем запускаю команду оболочки для запуска определенного количества новых процессов с помощью IO.popen в ruby, когда число меньше количества параллельного выполнения, которое я хочу сохранить.
Обратите внимание, что команда оболочки, которую мне нужно выполнить, является динамической и содержит переменную, сгенерированную из кода ruby, поэтому я должен сделать это в скрипте ruby.
GNU Parallel кажется лучшим вариантом для вас, если ruby не задействован.
источник