Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / Обещания

Свързване и комбиниране

Обещанията стават още по-мощни, когато ги съчетавате. Най-честата нужда е да изчакате няколко наведнъж. await приема списък от обещания и връща резултатите им по ред:

my @jobs = (start { 1 }), (start { 2 }), (start { 3 });
say await @jobs;     # (1 2 3)
say [+] await @jobs; # 6

Трите задачи вървят паралелно; await @jobs изчаква всички и връща (1, 2, 3). Понеже резултатите се връщат в същия ред като обещанията, можете да ги свиете както обикновено.

Можете и да свържете работа с обещание чрез .then, който изпълнява следващ блок, щом обещанието приключи. Вътре в него .result е стойността на първоначалното обещание:

my $p = start { 10 };
my $q = $p.then({ .result * 2 });
say await $q; # 20

$q е ново обещание, което удвоява резултата на $p. Изчакването му дава 20.

Блокът няма изричен параметър, така че получава приключилото обещание като променливата тема $_ — затова голото .result работи: всъщност това е $_.result. Ако предпочитате да дадете име на това обещание, използвайте остър блок:

my $q = $p.then(-> $prev { $prev.result * 2 });

Това се държи по абсолютно същия начин; $prev е първоначалното обещание $p, а $prev.result е неговата стойност.

С start, await и .then можете да описвате цели конвейери от паралелна работа: да пускате много задачи, да съчетавате резултатите им и да строите нови задачи от стари — и всичко това, без да докосвате нишка направо.

Практика

Направете 1 тест върху съдържанието на тази тема.

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

Тест — Обещания   |   Тест — Комбиниране на обещания


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