Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Prozesse und Threads: Arbeit aufteilen

Nach dieser Lektion: Ich kann eine Aufgabe in Stücke teilen, getrennt bearbeiten und die Teilergebnisse zusammenführen.

Lektion, 60 Min.1 BefehlParallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Eine große Aufgabe in Stücke teilen

Ein Prozess ist ein laufendes Programm mit eigenem Speicher. Ein Thread ist ein Ablauf innerhalb eines Prozesses, der den Speicher mit den anderen Threads teilt. Wer Arbeit aufteilt, lässt mehrere von ihnen gleichzeitig laufen.

Eine Bank prüft vier Millionen Buchungen. Sie schneidet die Liste in Stücke, gibt jedes Stück einer Recheneinheit und fügt die Teilergebnisse am Ende zusammen.

Am Ende dieser Lektion

Notiz

Ich kann eine Aufgabe in Stücke teilen, getrennt bearbeiten und die Teilergebnisse zusammenführen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Prozessein laufendes Programm mit eigenem Speicher
Threadein Ablauf in einem Prozess, mit gemeinsamem Speicher
Stückein zusammenhängender Teil der Daten (Chunk)
Teilergebnisdas Ergebnis für ein einziges Stück55
Zusammenführenaus den Teilergebnissen das Gesamtergebnis bilden (Merge)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Prozesse haben eigenen Speicher, Threads teilen ihn

Zwei Prozesse sehen die Daten des anderen nicht. Sie müssen sich Ergebnisse schicken. Zwei Threads eines Prozesses greifen auf dieselben Daten zu und können sich dabei stören.

In Python laufen Threads bei reiner Rechenarbeit nicht gleichzeitig. Darum teilt das Lab die Arbeit auf Prozesse auf.

Prozess und Thread im Vergleich

FrageProzessThread
Wem gehört der Speicher?Jedem Prozess alleinAllen Threads des Prozesses gemeinsam
Wie kommen Ergebnisse zurück?Sie werden geschicktSie liegen schon im selben Speicher
Was kann schiefgehen?Das Verschicken kostet ZeitZwei Threads ändern dasselbe Datum

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Daten werden in Stücke geschnitten

Ein Stück ist ein zusammenhängender Teil der Daten. Jede Recheneinheit bekommt eines und rechnet allein damit. So braucht sie keine andere.

Die Tabelle zeigt die Zahlen 1 bis 40, geschnitten in vier Stücke zu je zehn. Jedes Stück hat eine Teilsumme.

Vierzig Zahlen in vier Stücken

StückZahlenTeilsumme
01 bis 1055
111 bis 20155
221 bis 30255
331 bis 40355

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Schneiden, Teilsummen, Zusammenführen

Code: python
# Die Zahlen 1 bis 40 in vier Stuecke zu je zehn Zahlen.
daten = list(range(1, 41))
stuecke = []
for start in range(0, 40, 10):
    stuecke.append(daten[start:start + 10])

teilsummen = []
for stueck in stuecke:
    teilsummen.append(sum(stueck))
print("Teilsummen:", teilsummen)
print("Zusammengefuehrt:", sum(teilsummen))
print("In einem Stueck:", sum(daten))
# Aendern Sie die Stuecke auf je 5 Zahlen: range(0, 40, 5) und start + 5.

Zwei Prozesse teilen sich vier Stücke

Das Skript chunks.py schneidet dieselben Zahlen und lässt einen Pool aus zwei Prozessen die vier Teilsummen berechnen. Die Ergebnisse kommen in der Reihenfolge der Stücke zurück, auch wenn ein Prozess früher fertig ist.

Die Ausgabe ist englisch: „chunk“ heißt Stück, „partial sum“ Teilsumme. Die Zahlen sind dieselben wie oben.

Vier Stücke auf zwei Prozessen

Befehl
docker exec jupyter python3 steps/chunks.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Bei einem Rest sind einige Stücke größer

Zehn Elemente in drei Stücke: Zehn geteilt durch drei ist 3 Rest 1. Jedes Stück bekommt 3, und der Rest von 1 geht an das erste Stück.

So sind die Stücke höchstens um ein Element verschieden groß, und keine Recheneinheit wartet lange auf die anderen.

Zehn Elemente in drei Stücken

StückElementeGröße
01, 2, 3, 44
15, 6, 73
28, 9, 103

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Der Mittelwert der Mittelwerte täuscht

Code: python
# Zwei Stuecke ungleicher Groesse.
stuecke = [[2, 2, 2], [10]]

mittel_a = sum(stuecke[0]) / len(stuecke[0])
mittel_b = sum(stuecke[1]) / len(stuecke[1])
alles = 0
anzahl = 0
for stueck in stuecke:
    alles = alles + sum(stueck)
    anzahl = anzahl + len(stueck)
print("Mittel der Mittelwerte:", (mittel_a + mittel_b) / 2)
print("Richtiger Mittelwert:", alles / anzahl)
# Ersetzen Sie [10] durch [10, 10, 10] und starten Sie erneut.

Ein häufiger Fehler

Warnung

Viele denken, man könne die Teilergebnisse immer einfach verrechnen. Bei einer Summe stimmt das. Beim Mittelwert stimmt es nur, wenn alle Stücke gleich groß sind. Schicken Sie darum aus jedem Stück die Summe und die Anzahl zurück.

Weiterführend

Welche Teilergebnisse müssten Sie zurückschicken, um den größten Wert zu finden? Und welche, um den Mittelwert zu bilden?

Schreiben Sie auf, was ein Stück zurückgibt, und wie das Zusammenführen daraus das Gesamtergebnis macht.

Über dieses Lab und seinen Quellcode: Parallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.