|
В предыдущем примере мы использовали явную блокировку с помощью мьютексов для синхронизации доступа к общему состоянию из нескольких горутин. Другой вариант — использовать встроенные средства синхронизации горутин и каналов для достижения того же результата. Такой подход на основе каналов соответствует идеям Go о разделении памяти через взаимодействие, когда каждый фрагмент данных принадлежит ровно одной горутине. |
|
![]()
|
|
|
|
|
В этом примере состояние будет принадлежать одной
горутине. Это гарантирует, что данные никогда не будут
повреждены при конкурентном доступе. Чтобы прочитать
или записать это состояние, другие горутины будут
отправлять сообщения горутине-владельцу и получать
соответствующие ответы. Структуры |
|
|
|
|
Как и раньше, будем считать, сколько операций выполнено. |
|
|
Каналы |
|
|
Вот горутина, которая владеет |
|
|
Здесь запускаются 100 горутин для отправки запросов
на чтение горутине-владельцу состояния через канал |
|
|
Также запускаем 10 записей, используя аналогичный подход. |
|
|
Дадим горутинам поработать секунду. |
|
|
Наконец, фиксируем и выводим счётчики операций. |
|
|
Запуск программы показывает, что пример управления состоянием на основе горутин выполняет около 80 000 операций. |
|
|
В данном конкретном случае подход на основе горутин оказался немного сложнее, чем на основе мьютексов. Тем не менее он может быть полезен в определённых |
|
|
или когда управление несколькими мьютексами чревато |
|
|
естественным, особенно с точки зрения понимания корректности программы. |
Далее: Сортировка.