Войти Регистрация
Конкурентность

11. Таймаут геокодера и утечка горутин

Лёгкая

Go · 35 строк

Resolve ищет координаты адреса подачи такси. Ответ нужен за 300 мс, иначе приложение просит поставить точку на карте. Вызовов — 5 000 в секунду, около 3 % не укладываются в таймаут.

Отметьте строки с ошибками.

В работе: Определение точки подачи по введённому адресу.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
утечка горутиннебуферизованный каналcontextтаймаут

Источник: на задачах Яндекса: геокодер для такси. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package geo
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. )
  7. var ErrTimeout = errors.New("геокодер не ответил за 300 мс")
  8. type Point struct{ Lat, Lon float64 }
  9. type Geocoder interface {
  10. Geocode(ctx context.Context, addr string) (Point, error)
  11. }
  12. // Resolve ищет координаты адреса подачи такси.
  13. func Resolve(g Geocoder, addr string) (Point, error) {
  14. ch := make(chan Point)
  15. go func() {
  16. p, err := g.Geocode(context.Background(), addr)
  17. if err != nil {
  18. return
  19. }
  20. ch <- p
  21. }()
  22. select {
  23. case p := <-ch:
  24. return p, nil
  25. case <-time.After(300 * time.Millisecond):
  26. return Point{}, ErrTimeout
  27. }
  28. }