Приостановить все, кроме x задач, интенсивно использующих процессор

782
Andrew Grimm

У меня есть около 50 папок данных для обработки, и у меня есть скрипт ruby, который обрабатывает файлы папки (какая папка обрабатывается на основе файла конфигурации .yml). И компьютер с четырьмя процессорами в нем.

Я хотел бы иметь возможность запустить 50 процессов, но только 4 из них активно работают в любое время, а остальные 46 приостановлены. Когда один из процессов завершится, я бы хотел, чтобы один из приостановленных процессов стал безостановочным, пока все 50 не будут завершены. Таким образом, я могу сделать

./super_script.rb > folder_1_log.txt *edit config.yml* ./super_script.rb > folder_2_log.txt *edit config.yml* ... 

И сосредоточьтесь на чем-то другом, пока обработка не будет завершена.

Можно ли сделать это? Есть ли какие-то термины для того, что я хочу, чтобы я мог гуглить?

(Другой альтернативой было бы сделать super_script способным к многопоточности - возможно, я пугающий кот из-за того, что не придерживаюсь этого подхода)

(Операционная система - Ubuntu Linux, и большую часть процессорного времени занимает не super_script.rb, а другие программы ruby, которые он вызывает через system ())

0
Разве этот вопрос не относится к StackOverflow.com? Peter Mortensen 15 лет назад 0
@ Питер, я бы подумал об обратном. Какие теги вы бы дали в SO? Andrew Grimm 15 лет назад 0
Возможные теги (хорошо, некоторые из них приведены выше): bash-программирование bash-script ruby ​​мультипрограммирование пакетная обработка межпроцессное взаимодействие распределенные вычисления кластерные вычисления Peter Mortensen 15 лет назад 0

1 ответ на вопрос

2
Martin B

Вот сценарий bash, который выглядит так, как будто он делает что-то близкое к тому, что вы хотите сделать - он запускает несколько процессов параллельно, но гарантирует, что одновременно выполняется не более n.

С другой стороны, если то, что вы делаете, связано с диском, а не с процессором (я спрашиваю, потому что вы говорите, что у вас есть «50 папок данных для обработки»), тогда вам может быть лучше запускать все процессы последовательно, чтобы избежать конфликта между дисками.

Благодарю. Я основал свой сценарий http://gist.github.com/148221 на нем Andrew Grimm 15 лет назад 0

Похожие вопросы