Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación concurrente / Hilos

Unir hilos

Para esperar a que un hilo termine, llama a .finish sobre él (también se escribe .join). El programa principal se detiene ahí hasta que el hilo acaba:

my $t = Thread.start({ say 'in the thread' });
$t.finish;
say 'done';

Esto imprime:

in the thread
done

Como .finish espera, el mensaje del hilo tiene garantizado aparecer antes que done. Sin el .finish, el orden sería impredecible, y el programa podría incluso terminar antes de que el hilo tuviera ocasión de imprimir.

Cuando arrancas varios hilos, unes cada uno para asegurarte de que todos han terminado:

my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });
$a.finish;
$b.finish;
say 'both finished';

Los dos hilos corren de forma concurrente, y unir ambos antes del say final garantiza que both finished solo se imprima cuando estén realmente acabados. Unir es la manera de traer el trabajo concurrente de vuelta a un punto predecible de tu programa.

Como una llamada a un método sobre una unión se propaga a todos los valores que contiene, puedes unir varios hilos en una sola expresión. Combínalos con el operador all, &, y llama a .finish sobre la unión:

my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });

($a & $b).finish;
say 'both finished';

Llamar a .finish sobre $a & $b lo ejecuta sobre ambos hilos, así que el programa espera hasta que ninguno siga corriendo: el mismo resultado que unirlos uno a uno, pero se lee como «termina estos dos» y funciona para cualquier número de hilos unidos con &.

Quiz — Hilos   |   Ejecute en un hilo


💪 O ve directamente a los ejercicios de esta sección.