@brikler
Deine ganzen angeführten Argumente/Beispiele haben nichts mit meinem Skript zu tun. Oder wenn "entfernt doch" habe ich das Gefühl:
a) du hast das Skript /den Code nicht verstanden
b) du "arbeitest" immer noch, oder beziehst dich, auf eine alte Version (die V3)
Das ist mein <g> Thread, bitte zeigt mir also evtl. Probleme mit Ausgaben/Ergebnisse des Skripts (-v/--verbose) direkt oder anhand vom Code.
Ich versuche nochmal etwas Licht in den Punkt "parallel -s/--sword) reinzubringen.
Wenn parallel genutzt wird dann:
a) startet das einen Perl-interpreter welcher parallel ausführt. Dieser Interpreter-Prozess startet nun x Tasks mit dem Befehl den man an parallel verfüttert.
b) Somit ist es unökonomisch parallel zu starten/nutzen wenn dieses nur einen oder sehr wenige "Befehle" in Tasks aufteilen muß/tut.
perl(parallel)->pacman -Fqx <abfrage> ist dann unsinnig wenn es letztendlich sowieso nur einen (oder 2,3) Tasks startet die pacman -Fqx parallel ausführen. Das kann besser eben nur durch einen Prozess, eben direkt pacman -Fqx erledigt werden.
Deshalb gibt es in V4-feature auch diese Kriterien, wann sich das aktiviert.
Machen wir das mal direkt am Skript und an einem nachvollziehbaren, sinnvollen Beispiel fest:
Das Modul amdgpu
amdgpu = (Ref:670 Found:662 Unique:1 Package(s):core/linux-firmware-amdgpu)
Wir wollen erfahren, welches Firmware-Paket dafür benötigt wird. Dafür müssen wir die 670 Referenzen(fw-files) darin untersuchen zu welchem Paket (pacman -Fqx <jedes_fw-file>) es gehört. Egal wie man es anstellt: das Ergebnis wird sein: linux-firmware-amdgpu
Im Skript (und als nachvollziehbares Beispiel) wird das so gehandhabt:
declare -a fw_files=($(LC_ALL=C.UTF-8 /usr/bin/modinfo -F firmware "amdgpu"))
Im array fw_files sind nun alle dateinamen, die das amdgpu ggf. benötigt.
Die V3 hätte nun so gearbeitet(Pseudo-Code):
Für jedes file aus array fw_files #(starte bei 1)
frage pacman ob und in welchem Paket dieses ist
fertig (ende bei 670)
paketname(n)_für_modul = uniq/einzigartige Kulmulation aller gefundenen paketnamen dieses Laufs
Das Ergebniss wäre: linux-firmware-amdgpu
Dafür hätte die V3 670 mal pacman -Fqx <file> starten müssen
Bei diesem Algorithmus hätte sich die Nutzung von parallel (mit all seinen "Nachteilen" für den Rechner) gelohnt. Da es statt gleichzeitig nur 1 Task 670x auszuführen eben 670 Tasks geteilt durch numProcs gebraucht hätte. Es wäre also "lediglich" für die gleiche Anzahl an Tasks weniger Zeit benötigt.
Die V4 (der Algorithmus darin) abeitet anders:
Für jedes file aus array fw_files #(starte bei 1)
frage pacman ob und in welchem Paket dieses ist
paket_gefunden? ja, dann unterbreche die Schleife hier
fertig (ende bei 670)
paketname(n)_für_modul = uniq/einzigartige Kulmulation aller gefundenen paketnamen dieses Laufs
Hierbei werden also keine 670 Tasks benötigt, sondern nur soviele bis pacman -Fqx ein Paket findet. Das kann schon im Durchauf 1 sein, oder in 2,3
Hierbei würde man von parallel IMHO nicht wesentlich profitieren(Zeit), was den ökonomischen Aufwand rechtfertigt. Deshalb gibt es im Skript V4-feature diese Kriterien wann parallel überhaupt "anspringt".
In V4/V4-feature könnt ihr das recht gut bei der verbose-Ausgabe sehen. An meinem Laptop mit geladenem amdgpu Modul:
amdgpu: = AMD GPU
V: Module referencing 645 firmware files
V: Searching: amdgpu/navi12_gpu_info.bin
V: Found and break here
Needed firmware package is: core/linux-firmware-amdgpu
Es wird nur 1x pacman gebraucht (Anzahl der Searching: Zeilen) bis das zugehörige Firmware-Paket gefunden wird.(break here).
Und da "lohnt" sich parallel eben nicht.
Die verbose Ausgabe für eure Module an eurem Rechner wird für jedes eurer Module ein ähnliches Bild geben.
Für mich als Fazit: der Einbau von parallel lohnt sich nicht (mehr)
Realer Code zum testen was parallel bewirken kann:
#/usr/bin/bash
#
#testmodule='amdgpu'
testmodule='iwlwifi'
declare -a fw_files=($(LC_ALL=C.UTF-8 /usr/bin/modinfo -F firmware "$testmodule"))
printf 'Modul: %s referenziert %d firmware files\n' "$testmodule" ${#fw_files[@]}
if [[ ! $1 ]]; then
# V3 methode
echo "Running sequential"
declare -i counter=0
for fw_file in ${fw_files[@]}; do
counter+=1
package_found=$(pacman -Fqx /usr/lib/firmware.*/"$fw_file")
printf 'Task %d von %d (Nutze CTRL_C wenn du nicht weiter warten willst\n' $counter ${#fw_files[@]}
[[ "$package_found" != "" ]] && echo "Package found: $package_found"
done
fi
if [[ "$1" == "-s" ]]; then
# mit parallel
echo "Running parallel"
package_found=$(parallel pacman -Fqx ::: /usr/lib/firmware.*/"${fw_files[@]}")
[[ "$package_found" != "" ]] && echo "Package found: $package_found"
fi
Ohne Parameter wird rein sequentiell gerarbeitet (wie es V3 noch gemacht hat)
Parameter -s bewirkt die Nutzung von parallel.
(Nur ganz Mutige aktivieren im Skript amdgpu statt iwlwifi - und lassen die sequentielle Suche dafür bis zum Ende durchlaufen... <g>)