Kapitel 32
Parallele Datenverarbeitung
914
Skript:
In diesem Beispiel wurde die Queue genutzt, um ein einzelnes Objekt an den Hauptprozess
zu senden. Eine typische Verwendung von Queues ist aber die Koordination der Datenkom-
munikation zwischen vielen Prozessen, zum Beispiel bei einer Implementierung des »Pro-
duzenten-Konsumenten«-Entwurfsmusters. Mehr dazu in Abschnitt 32.8.
32.6 Daten im Pool bearbeiten
Vielleicht die wichtigste Form der parallelen Datenverarbeitung nennt sich Datenparalleli-
tät. Die Idee: Es gibt eine umfangreiche Sequenz von Objekten und eine Funktion zur Bear-
beitung eines dieser Objekte. Die Elemente der Sequenz werden unter einem Pool von
nebenläufigen Prozessen aufgeteilt. Jeder Prozess wendet ein und dieselbe Funktion auf die
ihm zugeordneten Objekte an. Im Alltag findet man diese Arbeitsweise z.B. in folgender
Situation: Ein Team von vier Malern soll alle Türen eines Hauses neu lackieren. Die Leute
arbeiten gleichzeitig (parallel). Jeder macht die gleiche Tätigkeit, aber jeder wendet sie auf
eine andere Tür an. Wenn ein Maler mit seiner Tür fertig ist, übernimmt er die nächste, die
noch lackiert werden muss. Es ist klar, dass das Team schneller mit seiner Arbeit fertig ist
als ein einzelner Maler.
Wenn Sie mit dem Modul
multiprocessing ein datenparalleles Programm entwickeln,
können Sie so vorgehen:
Sie erzeugen eine Kollektion von Objekten eines bestimmten Typs T, z.B. eine Liste von
Zahlen. Das sind die Daten, die parallel verarbeitet werden sollen.
Sie definieren eine Funktion, die ein Objekt vom Typ T als Argument übernimmt und
ein Objekt vom Typ
R zurückgibt, z.B. eine Funktion, die eine Zahl verarbeitet und eine
Zahl als Rechenergebnis zurückgibt.
Mit einem Aufruf der Form Pool([processes]) erschaffen Sie einen Pool von Arbeits-
prozessen. Das optionale Argument
processes ist eine natürliche Zahl, die die Anzahl
der gewünschten Prozesse angibt (z.B. 4). Wenn das Argument fehlt, wird für
pro-
cesses
automatisch die Anzahl der Prozessoren genommen, die dem Betriebssystem
zur Verfügung stehen (der Wert, den
os.cpu_count() liefert).
from multiprocessing import Process, Queue
def square(i, q):
q.put(i * i) #1
if __name__ == '__main__':
q = Queue()
p = Process(target=square, args=(3, q)) #2
p.start()
result = q.get() #3
p.join()
print("Ergebnis:", result)

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.