Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Nebenläufige Programmierung / hyper und race 🆕
Ungeordnete Parallelität mit race
.race parallelisiert auf dieselbe Weise wie
.hyper, mit einem Unterschied: Es verspricht
nicht, die Ergebnisse in Reihenfolge zu liefern.
Welcher Arbeiter zuerst fertig ist, steuert sein Ergebnis zuerst
bei.
say (1..10).race.map(* ** 2).sort; # (1 4 9 16 25 36 49 64 81 100)Die Quadrate kommen in unvorhersagbarer Reihenfolge zurück, das
.sort steht also dort, um die Ausgabe bestimmt zu machen.
Hätten wir ohne Sortieren ausgegeben, wären alle Zahlen da, aber
womöglich durcheinander.
Da es die Ergebnisse nicht in Reihenfolge halten muss, kann
.race etwas weniger Aufwand haben als .hyper.
Die Abwägung ist einfach:
- nehmen Sie
.hyper, wenn die Reihenfolge der Ergebnisse zählt; - nehmen Sie
.race, wenn sie es nicht tut — etwa wenn Sie die Ergebnisse summieren, zählen oder sonst auf von der Reihenfolge unabhängige Weise verbinden.
say (1..100).race.map(* * 2).sum; # 10100Summieren ist von der Reihenfolge unabhängig, .race ist
hier also eine gute Wahl und ergibt dieselben 10100. Beiden
Methoden liegt derselbe Gedanke zugrunde — unabhängige Arbeit zugleich
laufen lassen —, und Sie wählen danach, ob Ihnen die Reihenfolge wichtig
ist.
Kursnavigation
← Quiz — hyper | Feinjustieren mit :batch und :degree →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.