Raku kurss / Funkcionālā, paralēlā, reaktīvā un tīmekļa programmēšana / Paralēlā programmēšana / hyper un race 🆕
Paralēls map ar hyper
Izsauciet sarakstam .hyper pirms map vai
grep, un darbs tiks izklaidīts pa vairākiem
darbapavedieniem — kamēr rezultāti joprojām atgriežas sākotnējā
secībā:
say (1..5).hyper.map(* * 2); # (2 4 6 8 10)Tas izskatās tieši tāpat kā parasts map, un rezultāts ir
identisks; vienīgā atšķirība ir tā, ka dubultošana var būt aprēķināta
dažādos kodolos vienlaikus.
.hyper tieši tāpat darbojas ar grep — katrs
elements tiek pārbaudīts paralēli, un tie, kas iziet cauri, joprojām
atgriežas savā sākotnējā secībā:
say (1..10).hyper.grep(* %% 2); # (2 4 6 8 10)Tā kā .hyper saglabā secību, tā ir tieša aizstājēja
lēnam map vai grep: nekas, kas ir atkarīgs no
rezultātu secības, nav jāmaina. Ieguvums parādās tikai tad, kad darbs ar
katru elementu ir pietiekami liels, lai atsvērtu pavedienu saskaņošanas
izmaksas — skaitļa kāpināšana kvadrātā īstenībā ir pārāk lēta, lai to
būtu vērts paralelizēt. Tiešām dārgam darbam ar katru elementu lielā
sarakstā .hyper par viena metodes izsaukuma cenu var
pārvērst garu gaidīšanu īsā.
Viena lieta, kas jāpatur prātā: vai darbs tiešām tiek
izklaidīts pa kodoliem, izlemj kompilators. Valoda nosaka rezultātus —
un .hyper gadījumā to sākotnējo secību —, bet nepieprasa
īstu paralēlu izpildi. .hyper un .race
paralēlismu pieprasa kā lūgumu, nevis kā prasību, tāpēc
konkrēts kompilators tos var izpildīt pavedienu baseinā vai arī klusi
apstrādāt elementus pēc kārtas. Uztveriet tos kā iespēju paātrināties,
nevis kā garantiju.
Tā kā secība tiek saglabāta, darbības, kas no tās ir atkarīgas, joprojām iznāk pareizi. Šeit katrs vārds tiek paralēli pārvērsts lielajos burtos, un tomēr gabali savienojas atpakaļ frāzē to sākotnējā secībā:
say <raku is fun>.hyper.map(*.uc).join(' '); # RAKU IS FUNPrakse
Jūs gaida 1 viktorīna par šī temata saturu.
Kursa navigācija
← hyper un race 🆕 | Viktorīna — hyper →
💪 Vai arī dodieties tieši uz šīs sadaļas
vingrinājumiem.