TGViewer
ryzhov_dev ryzhov_dev @ryzhov_dev · 11 subscribers
Post #7 57
Контекст в Go — грабли, на которые PHP-шники наступают стабильно

Честно: я тоже на это наступал. Причём не один раз.

В PHP всё просто — клиент отвалился, процесс умер, соединения закрылись. В Go так не работает. context.Context — это не "таймаут на запрос", это контракт: "вот сигнал остановиться, будь добр, услышь его". Если его игнорировать, работа продолжается, хотя результат уже никому не нужен. А ресурсы — коннекты к БД, горутины, память — висят.

Классика, которую я ловил:

- Горутина, запущенная из хендлера, не слушает ctx.Done().
- http.Client без таймаута и без контекста в запросе.
- db.Query(...) вместо db.QueryContext(ctx, ...).

Вот так горутина и утекает:


// было: горутина живёт дольше, чем нужно
func handler(w http.ResponseWriter, r *http.Request) {
go func() {
for {
doWork() // никто не останавливает
time.Sleep(time.Second)
}
}()
}

// стало: горутина слышит отмену и выходит
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
go func() {
for {
select {
case <-ctx.Done():
return
default:
doWork()
time.Sleep(time.Second)
}
}
}()
}


Без select с <-ctx.Done() горутина переживёт и хендлер, и смысл своего существования.

Самое противное — оно не падает. Просто под нагрузкой медленно течёт: пул коннектов забивается, горутин всё больше, память ползёт вверх. Ищется потом долго.

Мораль: в Go отмену надо прокидывать руками. Везде. Привычка из PHP "оно само" тут не работает.
  • 🔥 1
More from @ryzhov_dev
  1. Aug 21, 2026Мой райтап неожиданно залетел в топ-10 и Авито прислали свой мерч 🎉
  2. Jul 24, 2026На прошлых выходных принял участие в AvitoCTF и решил сделать райтап для задания МедоИИд �…
  3. Jun 1, 2026Rate limiting в Go — без магии, по делу Рейт-лимитер — штука, которую обычно добавляют в п…
  4. May 26, 2026Индексы в MariaDB, которая тянет и OLTP, и OLAP Писал недавно про одну базу под две нагруз…
  5. May 14, 2026Вчера у меня приняли финальный проект на курсе Go разработчика в Яндекс Практикуме 🥳 Тепе…
  6. May 12, 2026Nginx как reverse proxy — баги, которые вылезают только после деплоя Nginx выглядит просты…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →