Порахуйте частоту літер у текстах за допомогою паралельних обчислень.
Паралелізм полягає в тому, щоб виконувати паралельно те, що також можна виконати послідовно. Поширений приклад - підрахунок частоти літер. Застосуйте паралелізм, щоб обчислити загальну частоту кожної літери в масиві текстів.
Go підтримує конкурентність через «горутини», які запускаються ключовим словом go.
Це простий, легкий й елегантний спосіб забезпечити конкурентність і одна з найбільших переваг мови.
Можна помітити: хоч ця вправа й називається Паралельна частота літер, термін «паралельний» у Go зустрічається не дуже часто. Gophers вважають за краще використовувати термін конкурентність, щоб описати керування кількома незалежними горутинами («процесами» або «потоками» в контексті інших мов). Хоча ці терміни часто вживають як взаємозамінні, Gophers люблять бути технічно точними й кажуть «конкурентний», коли йдеться про позірно одночасне виконання горутин.
Хоча ми можемо планувати, щоб наші програми виконувалися паралельно, і часом може здаватися, що вони справді виконуються паралельно, без точного знання контексту виконання нашого коду ми можемо гарантувати лише те, що процеси виконуватимуться конкурентно. Іншими словами, вони можуть виконуватися послідовно так швидко, що ми не встигаємо цього помітити, але не строго одночасно.
Щоб дізнатися більше, зазирнімо до допису в блозі Go: Concurrency is not parallelism.
Якщо конкурентність у Go для нас нова тема, ось кілька ресурсів, з яких можна почати. Радимо переглянути їх перед тим, як братися за цю вправу:
А для справді глибокого занурення можна взяти книжку Concurrency in Go від @kat-co.
У цій вправі модульні тести не можуть визначити, чи наше конкурентне рішення добре.
Натомість краще розвʼязати цю вправу локально і виконати бенчмарки за допомогою go test -bench ..
Для доброго рішення конкурентна версія має показувати меншу кількість наносекунд на операцію (ns/op), ніж послідовна.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції165 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми дослідимо різницю між конкурентністю і паралелізмом, розглянувши різні підходи, які застосовують такі мови, як JavaScript, Go, Elixir і Rust.