Corso di Raku / Programmazione funzionale, concorrente, reattiva e web / Programmazione concorrente / Thread

Unire i thread

Per aspettare che un thread finisca, chiamavi sopra .finish (scritto anche .join). Il programma principale si mette in pausa lì finché il thread non ha finito:

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

Questo stampa:

in the thread
done

Poiché .finish aspetta, il messaggio del thread compare con certezza prima di done. Senza il .finish l’ordine sarebbe imprevedibile, e il programma potrebbe persino finire prima che il thread abbia avuto modo di stampare.

Quando avvii parecchi thread, unisci ciascuno per essere sicuro che siano tutti finiti:

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

I due thread girano in modo concorrente, e unirli entrambi prima del say finale garantisce che both finished venga stampato solo quando sono davvero finiti. Unire è il modo di riportare il lavoro concorrente in un punto prevedibile del tuo programma.

Poiché una chiamata di metodo su una junction si diffonde a ogni valore che essa contiene, puoi unire più thread in un’unica espressione. Combinali con l’operatore all & e chiama .finish sulla junction:

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

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

Chiamare .finish su $a & $b lo esegue su entrambi i thread, quindi il programma aspetta finché nessuno dei due sta ancora girando — lo stesso risultato che unirli uno per uno, ma si legge come «finisci entrambi questi» e funziona per qualunque numero di thread uniti con &.

Quiz — Thread   |   Eseguite in un thread


💪 Oppure vai direttamente agli esercizi di questa sezione.