Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación concurrente / hyper y race 🆕
Paralelismo sin orden con race
.race paraleliza igual que .hyper, con una
diferencia: no promete devolver los resultados en
orden. El trabajador que termina primero aporta primero su
resultado.
say (1..10).race.map(* ** 2).sort; # (1 4 9 16 25 36 49 64 81 100)Los cuadrados vuelven en un orden impredecible, así que el
.sort está ahí para hacer determinista la salida. Si
hubiéramos imprimido sin ordenar, los números estarían todos presentes
pero posiblemente barajados.
Como no tiene que mantener los resultados ordenados,
.race puede tener algo menos de sobrecarga que
.hyper. El compromiso es sencillo:
- usa
.hypercuando importe el orden de los resultados; - usa
.racecuando no importe; por ejemplo, cuando vayas a sumar, contar o combinar de cualquier otro modo los resultados sin depender del orden.
say (1..100).race.map(* * 2).sum; # 10100Sumar no depende del orden, así que .race es aquí una
buena elección y da el mismo 10100. Ambos métodos giran en
torno a la misma idea — dejar que el trabajo independiente corra a la
vez — y eliges entre ellos según te importe o no el orden.
Navegación del curso
← Quiz — hyper | Ajustar con :batch y :degree →
💪 O ve directamente a los ejercicios de esta
sección.