Parallelarbeit 1
02/09, S. 70: Der Artikel über die Parallelisierung mittels Bash-Skripten war sehr interessant. Jedoch möchte ich kurz darauf hinweisen, dass die Umsetzung sehr umständlich ist. Die Bash stellt eigene Funktionen für eine Jobverarbeitung zur Verfügung, um dasselbe Verhalten mit weniger Aufwand zu erreichen.
Angeregt durch die Idee versuchte ich mich an einem Skript (Listing 1), das sich genauso benutzen lässt wie das im Artikel. Die Kommunikation mit den Workern habe ich durch den direkten Aufruf des Jobs ersetzt.
Lars Täuber, per Mail
01 #!/bin/bash
02
03 : ${_cmd:="echo"}
04 : ${PMAX:=`ls -1d /sys/devices/system/cpu/cpu* | wc -l`}
05
06 dispatchWork() {
07 while read -r -u 0 LINE
08 do
09 while [ $(jobs -rp | wc -l) -ge $PMAX ]
10 do
11 sleep 1
12 done
13 eval $_cmd "$LINE" &
14 done
15 wait
16 }
|
Parallelarbeit 2
02/09, S. 70: Als Alternative zur der im Beitrag "Parallelarbeit" vorgestellten Lösung lässt sich »xargs« einsetzen:
find . -name '*.pdf' | xargs -n 1 -P 4 pdf2ps
Dieses Beispiel erzeugt aus allen PDF-Dokumenten Postscript-Dateien. Der Schalter »-n 1« sorgt dafür, dass immer genau ein Argument an das nachfolgende Programm weitergegeben wird. Der Schalter »-P 4« lässt maximal vier Prozesse zu. Ein kleines Wrapper-Skript passt die Prozessanzahl wie vorgeschlagen an die CPU-Anzahl an und überreicht die Dateinamen und den auszuführenden Befehl als Parameter.
Eine weitere Möglichkeit ist die Verwendung von Xjobs [http://www.maier-komor.de/xjobs.html] Auch hier reicht eine Zeile:
find . -name '*.pdf' | xjobs -j 4 -- pdf2ps
Fritz Mehner, per E-Mail
Mehrere Prozesse landen deshalb in der Regel auf verschiedenen CPUs eines Mehrprozessorsystems und laufen damit parallel ab, weil der CPU-Scheduler um einen Lastausgleich bemüht ist.
Allerdings können alle Ansätze, die allein darauf vertrauen, nicht garantieren, dass der Scheduler, der möglicherweise sehr viele Prozesse verwaltet, nicht doch mehrere oder gar alle der eigentlich zu parallelisierenden Tasks einer CPU zuordnet. Wollte man die gleichmäßige Verteilung tatsächlich erzwingen, böte sich dafür das Linux Utility »taskset« an, das es erlaubt, ausdrücklich die CPU zu bestimmen, auf der ein bestimmter Prozess laufen soll. (Jens-Christoph Brendel)