Курс по 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 го изпълнява върху двете нишки, така че програмата чака, докато нито една вече не работи — същият резултат като присъединяването им една по една, но се чете като „приключи и двете“ и работи за произволен брой нишки, съединени с &.

Навигация в курса

Тест — Нишки   |   Изпълнете в нишка


💪 Или преминете направо към упражненията в този раздел.