Планирование задач параллельно в Linux

260
Jonathan Michael Foonlan Tsang

У меня есть N = 128 (скажем) задач task 0, task 1... task N-1, что мне нужно, чтобы закончить. Каждая задача займет неизвестное количество времени для выполнения, и они могут быть выполнены в любом порядке. Я нахожусь на машине с большим количеством ядер, но я хочу выполнить одновременно только 16 из этих задач. Есть ли утилита для автоматизации этого?

я считал

$ for i in ; do nice -n 19 ./task $i & done; 

но это будет запускать все задачи одновременно. Скорее, я хотел бы что-то, что запустит первые 16 задач, а затем заменит новую, когда задача завершится.

1

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

3
grawity
  • Используйте GNU Parallel:

    $ parallel -j16 ./task ::: 
  • Используйте Moreutils параллельно :

    $ parallel -j16 ./task -- 
  • Используйте Make:

    $ make -j16 

    Makefile (не уверен, что стандарт или GNU Make-специфичны):

    .PHONY: $(MAKECMDGOALS) %: ./task $@ 
  • Напишите свой собственный:

    #!/usr/bin/env bash inputs=( ) nproc=16 njobs=0 for input in "$"; do until (( njobs < nproc )); do wait -n; (( --njobs )) done ./task "$input"& (( ++njobs )) done while (( njobs )); do wait -n; (( --njobs )) done 
В настоящее время GNU Parallel по умолчанию использует `:::` вместо `--`. Интересные мелочи: GNU Parallel изначально был оберткой вокруг `make`: https://www.gnu.org/software/parallel/history.html Ole Tange 5 лет назад 0
@OleTange: Ага, похоже, что я посмотрел на man-страницу _moreutils_ paralell (которая все еще использует `--`), а не на GNU параллельно. grawity 5 лет назад 0
Можно ли изменить список заданий для обработки, запустив очередь с `параллельным`? Или отменить некоторые более поздние задания, не прерывая те, которые выполняются прямо сейчас? Jonathan Michael Foonlan Tsang 5 лет назад 0
@JonathanMichaelFoonlanTsang https://zenodo.org/record/1146014 Прочтите разделы 7.8 и 7.9. Ole Tange 5 лет назад 0

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