Ми скористались mutex‘ами для синхронізації доступу до спільного стану в минулому прикладі. Іншим варіантом буде використання горутин та каналів задля отримання того ж ефекту. Цей спосіб також є ідіоматичним у Go - так ми можемо працювати з спільною пам’яттю віддаючи її у володіння лише 1-й горутині. |
|
|
|
|
|
У цьому прикладі наш стан буде переданий у володіння
лише одній горутині. Це гарантуватиме, що дані ніколи не будуть
зіпсовані одночасним доступом. Щоб читати та писати стан
- інші оперуючі горутини будуть надсилати повідомлення
головній горутині і отримувати належні відповіді.
Ці структури - |
|
|
|
Як і раніше, ми будемо рахувати операції які ми виконуємо. |
|
Наші канали - |
|
Ця горутина - є власником стану (який був мапою в
попередньому прикладі), який, наразі є приватним для
горутини зі станом. Ця горутина у циклі отримує запити
на читання та запис з відповідних каналів (зверніть увагу
на |
|
Тут ми запускаємо 100 горутин, що будуть надсилати запити
зчитування до головної горутини через канал |
|
Використовуючи такий же метод - ми запускаємо 10 горутин, які писатимуть дані. |
|
Даємо нашим горутинам попрацювати близько секунди. |
|
Нарешті, дивимось скільки було зчитувань та записів: |
|
Запуск програми продемонструє що наш базований на горутинах приклад управління станом проводить біля 80-85 тис операцій. |
|
Конкретно цей прaклад був трошка менш задіяний в роботі ніж базований на mutex-ах. Слідує використовувати той спосіб який вам більш до впоодби, з урахуванням розуміння ситуації наскільки коректно працює ваша програма. |
Наступний приклад: Сортування.