Agendando tarefas em paralelo no Linux

1

Eu tenho N = 128 (digamos) tarefas, task 0 , task 1 , ... task N-1 , que preciso concluir. Cada tarefa levará um tempo desconhecido para ser concluída e poderá ser concluída em qualquer ordem. Eu estou em uma máquina que tem um grande número de núcleos, mas eu só quero executar 16 dessas tarefas por vez. Existe um utilitário para automatizar isso?

Eu considerei

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

mas isso executaria todas as tarefas ao mesmo tempo. Em vez disso, gostaria de algo que inicie as primeiras 16 tarefas e, em seguida, substitua-as por uma nova sempre que uma tarefa terminar.

    
por Jonathan Michael Foonlan Tsang 08.10.2018 / 22:41

1 resposta

3
  • Use o Paralelo GNU:

    $ parallel -j16 ./task ::: {0..127}
    
  • Use Moreutils paralelo :

    $ parallel -j16 ./task -- {0..127}
    
  • Use o Make:

    $ make -j16 {0..127}
    

    Makefile (não tenho certeza se o padrão ou o GNU Make específico):

    .PHONY: $(MAKECMDGOALS)
    %:
        ./task $@
    
  • Escreva seu próprio:

    #!/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
    
por 08.10.2018 / 22:52