Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / hyper и race 🆕
Паралелен map с hyper
Извикайте .hyper върху списък преди map или
grep и работата ще бъде разпределена между няколко работни
нишки — а резултатите пак ще се върнат в първоначалния
ред:
say (1..5).hyper.map(* * 2); # (2 4 6 8 10)Това изглежда точно като обикновен map и резултатът е
същият; единствената разлика е, че удвояванията може да са били
изчислени на различни ядра едновременно.
.hyper работи с grep по същия начин — всеки
елемент се проверява паралелно, а онези, които минат, пак се връщат в
първоначалния си ред:
say (1..10).hyper.grep(* %% 2); # (2 4 6 8 10)Понеже .hyper запазва реда, той е пряка замяна на бавен
map или grep: нищо, което зависи от реда на
резултатите, не се налага да се променя. Ползата се появява само когато
работата върху всеки елемент е достатъчно голяма, за да натежи над
цената на координирането на нишките — повдигането на число на квадрат
всъщност е твърде евтино, за да си струва да се паралелизира. За
наистина скъпа работа върху елемент в голям списък .hyper
може да превърне дълго чакане в кратко срещу цената на едно извикване на
метод.
Едно нещо, което да имате предвид: дали работата наистина се
разпределя между ядрата, зависи от компилатора. Езикът фиксира
резултатите — а за .hyper и техния първоначален ред, — но
не изисква действително паралелно изпълнение. .hyper и
.race молят за паралелност, вместо да я
изискват, така че даден компилатор може да ги изпълни върху пул от
нишки, а може и тихо да обработи елементите последователно. Гледайте на
тях като на възможност за ускорение, а не като на гаранция за
такова.
Понеже редът се запазва, операциите, които зависят от него, пак излизат правилни. Тук всяка дума се превръща в главни букви паралелно, а парчетата все пак се слепват обратно във фразата в първоначалната си последователност:
say <raku is fun>.hyper.map(*.uc).join(' '); # RAKU IS FUNПрактика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← hyper и race 🆕 | Тест — hyper →
💪 Или преминете направо към упражненията в този
раздел.