Raku kurss / Funkcionālā, paralēlā, reaktīvā un tīmekļa programmēšana / Paralēlā programmēšana / Solījumi
Ķēdēšana un apvienošana
Solījumi kļūst vēl jaudīgāki, kad tos apvieno. Visbiežākā vajadzība
ir sagaidīt vairākus uzreiz. await pieņem
solījumu sarakstu un atgriež to rezultātus pēc kārtas:
my @jobs = (start { 1 }), (start { 2 }), (start { 3 });
say await @jobs; # (1 2 3)
say [+] await @jobs; # 6Visi trīs darbi izpildās vienlaikus; await @jobs sagaida
tos visus un atdod (1, 2, 3). Tā kā rezultāti atnāk tādā
pašā secībā kā solījumi, tos var reducēt kā parasti.
Darbu solījumam var arī piesiet ar .then, kas izpilda
turpinājuma bloku, tiklīdz solījums ir gatavs. Tā iekšienē
.result ir sākotnējā solījuma vērtība:
my $p = start { 10 };
my $q = $p.then({ .result * 2 });
say await $q; # 20$q ir jauns solījums, kas dubulto $p
rezultātu. Tā gaidīšana dod 20.
Blokam nav tieši norādīta parametra, tāpēc tas saņem pabeigto
solījumu kā temata mainīgo $_ — un tieši tāpēc darbojas
kails .result: īstenībā tas ir $_.result. Ja
labprātāk dotu šim solījumam vārdu, izmantojiet bultiņas bloku:
my $q = $p.then(-> $prev { $prev.result * 2 });Tas uzvedas tieši tāpat; $prev ir sākotnējais solījums
$p, un $prev.result ir tā vērtība.
Ar start, await un .then jūs
varat aprakstīt veselus konkurenta darba konveijerus: palaist daudzus
uzdevumus, apvienot to rezultātus un no vecajiem būvēt jaunus uzdevumus
— un neviena pavediena tieši neaiztiekot.
Prakse
Jūs gaida 1 viktorīna par šī temata saturu.
Kursa navigācija
← Viktorīna — Solījumi | Viktorīna — Solījumu apvienošana →
💪 Vai arī dodieties tieši uz šīs sadaļas
vingrinājumiem.