Курс по 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


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