1

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

я считал

$ for i in {0..127}; do nice -n 19 ./task $i & done;

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

1 ответ1

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

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

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

    $ make -j16 {0..127}
    

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

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

    #!/usr/bin/env bash
    inputs=( {0..127} )
    nproc=16
    njobs=0
    for input in "${inputs[@]}"; do
        until (( njobs < nproc )); do
            wait -n; (( --njobs ))
        done
        ./task "$input"& (( ++njobs ))
    done
    while (( njobs )); do
        wait -n; (( --njobs ))
    done
    

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