Ist dies der richtige Weg, um mehrere aufeinanderfolgende Verarbeitungen im Hintergrund zu starten?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Alle j
sollten für eine bestimmte Zeit nacheinander verarbeitet werden i
, aber alle i
sollten gleichzeitig verarbeitet werden.
bash
background-process
for
parallelism
Funkgesteuert
quelle
quelle
Antworten:
Die äußere Schleife, die Sie haben, ist im Grunde
Dies würde zehn gleichzeitige Instanzen von
some_compound_command
im Hintergrund starten . Sie werden so schnell wie möglich gestartet, aber nicht ganz "alle zur gleichen Zeit" (dh wenn es sehr wenig Zeit in Anspruchsome_compound_command
nimmt , kann die erste gut enden, bevor die letzte beginnt).Die Tatsache, dass es sich
some_compound_command
zufällig um eine Schleife handelt, ist nicht wichtig. Dies bedeutet, dass der von Ihnen angezeigte Code insofern korrekt ist , als die Iterationen der innerenj
Schleife nacheinander ausgeführt werden, aber alle Instanzen der inneren Schleife (eine pro Iteration der äußereni
Schleife) gleichzeitig gestartet werden.Das einzige, was Sie beachten sollten, ist, dass jeder Hintergrundjob in einer Subshell ausgeführt wird. Dies bedeutet, dass Änderungen an der Umgebung (z. B. Änderungen an Werten von Shell-Variablen, Änderungen des aktuellen Arbeitsverzeichnisses mit
cd
usw.) in einer Instanz der inneren Schleife außerhalb dieses bestimmten Hintergrundjobs nicht sichtbar sind.Was Sie möglicherweise hinzufügen möchten, ist eine
wait
Anweisung nach Ihrer Schleife, um zu warten, bis alle Hintergrundjobs tatsächlich beendet sind, zumindest bevor das Skript beendet wird:quelle
Wenn Sie GNU Parallel haben, würden Sie Folgendes tun:
Einer der Vorteile ist, dass die Ausgabe aus dem parallelen Betrieb
run_commands
nicht gemischt wird.quelle