У меня есть около 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())

1 ответ1

2

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .