Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / Нишки
Присъединяване на нишки
За да изчакате нишка да приключи, извикайте .finish
върху нея (пише се и .join). Основната програма спира там,
докато нишката не завърши:
my $t = Thread.start({ say 'in the thread' });
$t.finish;
say 'done';Това отпечатва:
in the thread
doneПонеже .finish изчаква, съобщението на нишката
гарантирано се появява преди done. Без .finish
редът щеше да е непредвидим и програмата дори можеше да приключи, преди
нишката да успее да отпечата нещо.
Когато стартирате няколко нишки, присъединявате всяка от тях, за да сте сигурни, че всички са приключили:
my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });
$a.finish;
$b.finish;
say 'both finished';Двете нишки вървят паралелно, а присъединяването и на двете преди
последното say гарантира, че both finished се
отпечатва едва когато те наистина са приключили. Присъединяването е
начинът да съберете паралелната работа обратно в предвидима точка от
програмата си.
Понеже извикването на метод върху съединение се разпространява към
всяка стойност, която то съдържа, можете да присъедините няколко нишки с
един израз. Съчетайте ги с оператора all —
& — и извикайте .finish върху
съединението:
my $a = Thread.start({ 1 + 1 });
my $b = Thread.start({ 2 + 2 });
($a & $b).finish;
say 'both finished';Извикването на .finish върху $a & $b го
изпълнява върху двете нишки, така че програмата чака, докато нито една
вече не работи — същият резултат като присъединяването им една по една,
но се чете като „приключи и двете“ и работи за произволен брой нишки,
съединени с &.
Навигация в курса
← Тест — Нишки | Изпълнете в нишка →
💪 Или преминете направо към упражненията в този
раздел.