Corso di Raku / Programmazione funzionale, concorrente, reattiva e web / Programmazione concorrente / hyper e race 🆕
Parallelismo senza ordine con race
.race parallelizza allo stesso modo di
.hyper, con una differenza: non promette
di restituire i risultati in ordine. Il lavoratore che finisce per primo
contribuisce per primo il proprio risultato.
say (1..10).race.map(* ** 2).sort; # (1 4 9 16 25 36 49 64 81 100)I quadrati tornano in un ordine imprevedibile, quindi il
.sort è lì per rendere deterministico l’output. Se avessimo
stampato senza ordinare, i numeri ci sarebbero stati tutti ma forse
mescolati.
Poiché non deve tenere ordinati i risultati, .race può
avere un po’ meno sovraccarico di .hyper. Il compromesso è
semplice:
- usa
.hyperquando l’ordine dei risultati conta; - usa
.racequando non conta — per esempio quando stai per sommare, contare o combinare altrimenti i risultati in un modo indipendente dall’ordine.
say (1..100).race.map(* * 2).sum; # 10100Sommare è indipendente dall’ordine, quindi .race qui è
una buona scelta e dà lo stesso 10100. Entrambi i metodi
riguardano la stessa idea — lasciare che il lavoro indipendente giri
insieme — e scegli fra loro in base al fatto che l’ordinamento ti
interessi o no.
Navigazione del corso
← Quiz — hyper | Regolare con :batch e :degree →
💪 Oppure vai direttamente agli esercizi di questa
sezione.