Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Concurrent programmeren / Threads
Threads samenvoegen
Om op de voltooiing van een thread te wachten, roep je er
.finish op aan (ook geschreven als .join). Het
hoofdprogramma pauzeert daar tot de thread klaar is:
my $t = Thread.start({ say 'in the thread' });
$t.finish;
say 'done';Dit drukt af:
in the thread
doneOmdat .finish wacht, verschijnt de melding van de thread
gegarandeerd vóór done. Zonder de .finish zou
de volgorde onvoorspelbaar zijn, en zou het programma zelfs kunnen
eindigen voordat de thread de kans had om af te drukken.
Wanneer je meerdere threads start, voeg je ze elk samen om er zeker van te zijn dat ze allemaal klaar zijn:
my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });
$a.finish;
$b.finish;
say 'both finished';De twee threads lopen gelijktijdig, en beide samenvoegen vóór de
afsluitende say garandeert dat both finished
pas afgedrukt wordt zodra ze werkelijk klaar zijn. Samenvoegen is hoe je
gelijktijdig werk weer op een voorspelbaar punt in je programma
bijeenbrengt.
Omdat een methodeaanroep op een junctie zich over elke waarde erin
verspreidt, kun je meerdere threads in één uitdrukking samenvoegen.
Combineer ze met de all-operator & en roep
.finish op de junctie aan:
my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });
($a & $b).finish;
say 'both finished';.finish op $a & $b aanroepen draait die
op beide threads, dus wacht het programma tot geen van beide nog loopt —
hetzelfde resultaat als ze een voor een samenvoegen, maar het leest als
“maak deze allebei af” en werkt voor elk aantal threads dat met
& samengevoegd is.
Cursusnavigatie
← Quiz — Threads | Voer uit in een thread →
💪 Of ga direct naar
de oefeningen in deze sectie.