Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Concurrent programmeren / hyper en race 🆕
Parallelle map met hyper
Roep .hyper op een lijst aan vóór een map
of grep, en het werk wordt over meerdere werkthreads
verspreid — terwijl de resultaten toch in de oorspronkelijke
volgorde terugkomen:
say (1..5).hyper.map(* * 2); # (2 4 6 8 10)Dit ziet er precies uit als een gewone map, en het
resultaat is identiek; het enige verschil is dat de verdubbelingen
mogelijk tegelijk op verschillende kernen berekend zijn.
.hyper werkt op dezelfde manier met grep —
elk element wordt parallel getest, en de elementen die slagen komen toch
in hun oorspronkelijke volgorde terug:
say (1..10).hyper.grep(* %% 2); # (2 4 6 8 10)Omdat .hyper de volgorde bewaart, is het een
rechtstreekse vervanger voor een trage map of
grep: niets wat van de volgorde van de resultaten afhangt
hoeft te veranderen. Het voordeel treedt pas op wanneer het werk per
element groot genoeg is om tegen de kosten van het coördineren van
threads op te wegen — een getal kwadrateren is in werkelijkheid veel te
goedkoop om te parallelliseren. Voor werkelijk duur werk per element
over een grote lijst kan .hyper een lange wachttijd in een
korte veranderen voor de prijs van één methodeaanroep.
Eén ding om in gedachten te houden: of het werk werkelijk
over kernen verspreid wordt, is aan de compiler. De taal legt de
resultaten vast — en voor .hyper hun oorspronkelijke
volgorde — maar zij eist geen daadwerkelijke parallelle uitvoering.
.hyper en .race vragen om
parallellisme in plaats van het te vereisen, dus een bepaalde compiler
mag ze op een threadpool draaien of de elementen stilletjes op volgorde
verwerken. Beschouw ze als een kans op versnelling, niet als een
garantie ervan.
Omdat de volgorde bewaard blijft, komen bewerkingen die er van afhangen toch goed uit. Hier wordt elk woord parallel in hoofdletters gezet, en toch voegen de stukken zich in hun oorspronkelijke volgorde weer tot de zin:
say <raku is fun>.hyper.map(*.uc).join(' '); # RAKU IS FUNPraktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Cursusnavigatie
← hyper en race 🆕 | Quiz — hyper →
💪 Of ga direct naar de oefeningen in deze
sectie.