Senior
25
What problems can occur in concurrent Go programs and how do you detect them?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В конкурентных Go-программах могут возникать следующие проблемы:
- Гонки данных (data races): когда несколько горутин одновременно обращаются к одной переменной без синхронизации, что приводит к непредсказуемому поведению.
- Взаимные блокировки (deadlocks): когда горутины ждут друг друга, и выполнение программы останавливается.
- Голодание (starvation): когда одна горутина постоянно получает ресурсы, а другая — нет.
- Потеря сообщений или неправильный порядок в каналах: если каналы используются неправильно.
Для обнаружения гонок данных в Go есть встроенный инструмент — race detector. Его можно включить при компиляции или запуске тестов:
go run -race main.go
go test -race ./...
Для выявления deadlock'ов и других проблем полезно использовать профилирование и трассировку (pprof, trace), а также внимательно проектировать логику синхронизации с помощью sync.Mutex, sync.WaitGroup, каналов и других примитивов.
Пример гонки данных:
type Counter struct {
count int
}
func (c *Counter) Inc() {
c.count++ // незащищенный доступ
}
func main() {
c := &Counter{}
for i := 0; i < 1000; i++ {
go c.Inc()
}
time.Sleep(time.Second)
fmt.Println(c.count) // может быть меньше 1000 из-за гонки
}
Использование -race поможет выявить такие проблемы.