Ответ
Deadlock возникает, когда горутины блокируют друг друга, ожидая ресурсы. Основные способы избежать:
- Порядок блокировок – всегда захватывайте мьютексы в одинаковом порядке:
var mu1, mu2 sync.Mutex
// Правильно:
mu1.Lock()
mu2.Lock()
// ...
mu2.Unlock()
mu1.Unlock()
- Используйте select с таймаутами для каналов:
select {
case <-ch:
// получено значение
case <-time.After(1 * time.Second):
// таймаут
}
-
Разделяйте ресурсы – проектируйте так, чтобы горутины не зависели сильно друг от друга.
-
Используйте sync.WaitGroup для ожидания завершения горутин вместо блокировок.
-
Detect deadlocks –
go run -raceдля обнаружения гонок данных.