Sobes.tech
Senior
25

What problems can occur in concurrent Go programs and how do you detect them?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

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 поможет выявить такие проблемы.