Parallele Verarbeitung mit xargs
Da unsere Bibliothek weiter wächst, möchten wir unsere Dateiverarbeitung beschleunigen. Für Aufgaben, die unabhängig voneinander sind, kann die parallele Ausführung die gesamte Ausführungszeit erheblich reduzieren. Die Option -P
von xargs
ermöglicht es uns, mehrere Instanzen des Zielbefehls gleichzeitig auszuführen, was die Leistung für E/A-gebundene Operationen oder Aufgaben, die Wartezeiten beinhalten, erheblich verbessern kann. Dies ist ein wesentlicher Vorteil von xargs
gegenüber der einfachen sequenziellen Verarbeitung mit einer for
-Schleife.
Zuerst erstellen wir ein Skript, das die Verarbeitung eines Buches simuliert, indem es einen Zeitstempel zu seinem Inhalt hinzufügt und eine Verzögerung einführt. Diese Verzögerung hilft uns, die parallele Ausführung zu visualisieren.
cat ~/project/process_book.sh
Sie sollten Folgendes sehen:
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## Simulate some processing time
Dieses Skript macht Folgendes:
- Es nimmt einen Buchtitel als Argument (
$1
).
- Es erstellt eine neue Datei mit dem Präfix "processed_" vor dem Buchtitel.
- Es schreibt eine Nachricht in diese Datei, einschließlich des aktuellen Datums und der Uhrzeit.
- Es wartet 2 Sekunden, um etwas Verarbeitungszeit zu simulieren, wodurch die parallele Ausführung deutlicher wird.
Nun verwenden wir xargs
mit der Option -P
, um Bücher parallel zu verarbeiten. Wir verwenden auch wieder die Option -I
, um jeden Buchtitel als Argument an unser Skript zu übergeben.
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
Lassen Sie uns diesen Befehl aufschlüsseln:
cat ~/project/more_books.txt
: Dies liest unsere Bücherliste.
|
: Dieses Pipe-Symbol sendet die Ausgabe an xargs
.
xargs -P 3
: Dies weist xargs
an, bis zu 3 Prozesse parallel auszuführen. xargs
startet bis zu 3 Instanzen des Zielbefehls gleichzeitig, wobei jede ein oder mehrere Eingabeelemente verarbeitet.
-I {}
: Dies definiert {}
als Platzhalter für jedes Eingabeelement, das als Argument an unser Skript übergeben wird.
~/project/process_book.sh {}
: Dies ist der Befehl, der für jedes Buch ausgeführt werden soll, wobei {}
durch den Buchtitel ersetzt wird.
Dieser Befehl beginnt mit der gleichzeitigen Verarbeitung von bis zu 3 Büchern. Nach der Ausführung des Befehls können Sie den Inhalt der verarbeiteten Dateien überprüfen:
cat ~/project/processed_*
Sie sollten eine Ausgabe sehen, die zeigt, dass die Bücher zu leicht unterschiedlichen Zeiten verarbeitet wurden, was auf eine parallele Ausführung hindeutet. Die genauen Zeiten variieren, aber Sie könnten so etwas sehen:
Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024
Beachten Sie, wie die ersten drei Bücher gleichzeitig mit der Verarbeitung beginnen und die letzten beiden etwa 2 Sekunden später (aufgrund von sleep 2
in unserem Skript). Dies demonstriert die parallele Verarbeitung in Aktion, ein erheblicher Vorteil der Verwendung von xargs
zur Beschleunigung unabhängiger Aufgaben.