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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Prozess | ein laufendes Programm mit eigenem Speicher | |
| Thread | ein Ablauf in einem Prozess, mit gemeinsamem Speicher | |
| Stück | ein zusammenhängender Teil der Daten (Chunk) | |
| Teilergebnis | das Ergebnis für ein einziges Stück | 55 |
| Zusammenführen | aus 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
| Frage | Prozess | Thread |
|---|---|---|
| Wem gehört der Speicher? | Jedem Prozess allein | Allen Threads des Prozesses gemeinsam |
| Wie kommen Ergebnisse zurück? | Sie werden geschickt | Sie liegen schon im selben Speicher |
| Was kann schiefgehen? | Das Verschicken kostet Zeit | Zwei 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ück | Zahlen | Teilsumme |
|---|---|---|
| 0 | 1 bis 10 | 55 |
| 1 | 11 bis 20 | 155 |
| 2 | 21 bis 30 | 255 |
| 3 | 31 bis 40 | 355 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Schneiden, Teilsummen, Zusammenführen
# 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
docker exec jupyter python3 steps/chunks.pyHier 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ück | Elemente | Größe |
|---|---|---|
| 0 | 1, 2, 3, 4 | 4 |
| 1 | 5, 6, 7 | 3 |
| 2 | 8, 9, 10 | 3 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Der Mittelwert der Mittelwerte täuscht
# 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.