Один из девизов Go: "Не общайтесь, разделяя память; делитесь памятью, общаясь".
Тем не менее, Go предоставляет традиционные механизмы блокировки в пакете sync. Большинство проблем с блокировкой можно решить с помощью каналов или традиционных блокировок.
Так что вы должны использовать?
Используйте то, что наиболее выразительно и/или наиболее просто.
Распространенной ошибкой новичка в Go является чрезмерное использование каналов и goroutine только потому, что это возможно, и/или потому, что это весело. Не бойтесь использовать sync.Mutex, если это лучше всего подходит для вашей проблемы. Go прагматичен, позволяя вам использовать инструменты, которые наилучшим образом решают вашу проблему, и не заставляет вас использовать один стиль кода.
Как общее руководство, однако:
Канал | Мьютекс |
---|---|
передача права собственности на данные, раздача единиц работы, передача асинхронных результатов | кэши, состояние |
Если вы когда-нибудь обнаружите, что правила блокировки sync.Mutex становятся слишком сложными, спросите себя, может ли быть проще использовать канал(ы).
Группа ожидания (sync.WaitGroup)
Другим важным примитивом синхронизации является sync.WaitGroup. Он позволяет взаимодействующим группам совместно ожидать пороговое событие, прежде чем продолжить самостоятельно. Это полезно, как правило, в двух случаях.
Во-первых, при "очистке" можно использовать sync.WaitGroup, чтобы гарантировать, что все goroutines, включая основную (main), ожидают, пока все не завершатся чисто.
Второй более общий случай - это циклический алгоритм, который включает набор процедур, которые некоторое время работают независимо, затем все ждут на барьере, прежде чем продолжить самостоятельно. Этот шаблон может повторяться много раз. Данные могут быть обменены на барьерном событии. Эта стратегия является основой Массового Синхронного Параллелизма (BSP, Bulk Synchronous Parallelism).
Канал связи, мьютексы и группы ожидания являются взаимодополняющими и могут быть объединены.
Читайте также:
- Каналы в Golang предлагают синхронизированное общение
- Эффективный Go: параллелизм, go-процедуры (goroutines)
- Основы Go: sync.Mutex
Комментариев нет:
Отправить комментарий