Parallele Einplanung von Aufgaben unter Linux

344
Jonathan Michael Foonlan Tsang

Ich habe N = 128 (sagen wir) Aufgaben task 0, task 1... task N-1, dass ich vollenden müssen. Jede Aufgabe dauert in unbekannter Zeit und kann in beliebiger Reihenfolge ausgeführt werden. Ich befinde mich auf einer Maschine mit einer großen Anzahl von Kernen, aber ich möchte nur 16 dieser Aufgaben gleichzeitig ausführen. Gibt es ein Dienstprogramm, um dies zu automatisieren?

Ich überlegte

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

Dies würde jedoch alle Aufgaben gleichzeitig ausführen. Vielmehr möchte ich etwas, das die ersten 16 Aufgaben startet und dann, wenn eine Aufgabe abgeschlossen ist, durch eine neue ersetzt wird.

1

1 Antwort auf die Frage

3
grawity
  • Verwenden Sie GNU Parallel:

    $ parallel -j16 ./task ::: 
  • Verwenden Sie Moreutils parallel :

    $ parallel -j16 ./task -- 
  • Verwenden Sie Make:

    $ make -j16 

    Makefile (nicht sicher, ob Standard oder GNU-Make-spezifisch ist):

    .PHONY: $(MAKECMDGOALS) %: ./task $@ 
  • Schreibe dein Eigenes:

    #!/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 wird heutzutage standardmäßig auf `::: anstelle von - gesetzt. Wissenswertes: GNU Parallel war ursprünglich ein Wrapper um "make": https://www.gnu.org/software/parallel/history.html Ole Tange vor 5 Jahren 0
@OleTange: Aha, es sieht so aus, als ob ich auf die Manpage von _moreutils_ paralell (die immer noch "-" verwendet) und nicht auf GNU parallel geschaut hat. grawity vor 5 Jahren 0
Kann eine Liste mit zu bearbeitenden Jobs geändert werden, nachdem eine Warteschlange mit "parallel" gestartet wurde? Oder einige spätere Jobs abzubrechen, ohne die gerade laufenden Jobs abzubrechen? Jonathan Michael Foonlan Tsang vor 5 Jahren 0
@JonathanMichaelFoonlanTsang https://zenodo.org/record/1146014 Lesen Sie die Abschnitte 7.8 und 7.9. Ole Tange vor 5 Jahren 0