У меня есть несколько команд, которые я хотел бы выполнять параллельно. Команды почти идентичны. Можно ожидать, что они займут примерно одинаковое время и могут работать совершенно независимо. Они могут выглядеть так:
command -n 1 > log.1
command -n 2 > log.2
command -n 3 > log.3
...
command -n 4096 > log.4096
Я мог бы запустить их все параллельно в сценарии оболочки, но система попыталась бы загрузить больше, чем строго необходимо, чтобы загружать ЦП (каждая задача занимает 100% одного ядра до завершения). Это заставит диск треснуть и сделает все это медленнее, чем менее жадный подход к выполнению.
Наилучшим подходом, вероятно, является продолжение выполнения n
задач, где n
- количество доступных ядер.
Я стремлюсь не изобретать велосипед. Эта проблема уже была решена в программе Unix make
(при использовании с опцией -j n
). Мне было интересно, возможно ли было написать общие правила Makefile для вышеупомянутого, чтобы избежать Makefile линейного размера, который выглядел бы так:
all: log.1 log.2 ...
log.1:
command -n 1 > log.1
log.2:
command -n 2 > log.2
...
Если лучшим решением является не использование make
, а другая программа / утилита, я открыт для этого, пока зависимости разумны (make
был очень хорош в этом отношении).