Einfache Parallelverarbeitung mit xargs
Hallo, ich bin's, der Unfähige.
Es tut mir leid, dass es so lange her ist, seit ich das letzte Mal gepostet habe, aber ich lebe noch.
Ich habe einen gebrauchten Ryzen 5 gekauft, und zu meiner Überraschung waren die Pins verbogen, und es gab Probleme, wie dass nur ein Speichermodul erkannt wurde, aber ich komme irgendwie zurecht.
Ich habe ein weiteres AM4-M-ATX-Mainboard günstig bekommen, daher überlege ich, diesen Ryzen-Chip für den Bau eines Mini-PCs zu verwenden.
Praktisches xargs
xargs - Wikipediaxargs, ein existierender UNIX-Befehl, ist sehr nützlich.
Anfangs war ich nicht daran gewöhnt, aber je mehr ich es benutze, desto mehr Einsatzmöglichkeiten finde ich. Es ist ein sehr guter Befehl, der nicht einmal den Aufwand erfordert, eine einfache Schleife in einem Einzeiler zu schreiben.
Use Case
Nehmen wir zum Beispiel an, Sie haben Videos, die Sie mit yt-dlp speichern möchten, und diese existieren zeilenweise.
url1
url2
url3
Wenn Sie dies natürlich an eine Stapel-Parallelverarbeitung übergeben, wird die CPU-Last stark ansteigen. Wenn Sie dies also mit jeweils 2 Prozessen ausführen möchten, können Sie es wie folgt schreiben:
cat url-txt | xargs -I {} -P 2 yt-dlp {}
Erstaunlicherweise können Sie damit jeweils 2 Prozesse verarbeiten.
Lassen Sie uns das aufschlüsseln
Nun, wie funktioniert das?
Das Obige ist gleichbedeutend mit dem Folgenden:
yt-dlp url1 ; yt-dlp url2
yt-dlp url3
Mechanisch gesehen wird der Befehl, der an xargs übergeben wurde, bei jeder Ausführung ausgeführt.
Ist es so, als würde man eine Zeile lesen und sie als Array speichern?
Was ist ohne Optionen?
Ohne Optionen wird der Befehl, der an xargs übergeben wurde, als Ganzes angewendet.
Da die unterstützten Befehle begrenzt sind, scheint es besser zu sein, die Option -I zu verwenden.
In Fällen wie dem Folgenden:
cat url-txt | xargs yt-dlp
In diesem Fall wurde der folgende Befehl ausgeführt:
yt-dlp url1 url2 url3
Daher scheint es besser zu sein, die Verarbeitung so weit wie möglich mit -I durchzuführen, aber an bestimmten Stellen ist es auch ohne Optionen in Ordnung.
Use Case2
Es ist auch nützlich, wenn Sie mit dem find-Befehl nur nach bestimmten Dateinamen grepen oder seden möchten.
find . -name "testfile" | xargs -I {} grep "return 0" {}
Auf diese Weise ist es möglich, nur bestimmte Dateien mit einer so kurzen Beschreibung zu grepen.
Das war's für heute.
Bis zum nächsten Mal.