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

25. Счётчик прослушиваний в МТС Музыке

Лёгкая

Go · 27 строк

Каждую минуту приходит пачка примерно из 10 тысяч событий. Прослушиванием считаем трек, который играл хотя бы 30 секунд: по этим числам платим правообладателям.

Раз в час CountPlays получает 60 пачек и считает их параллельно. Сервис собран на Go 1.22. Отметьте строки с ошибками.

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

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

Источник: наша задача на данных МТС Музыки: прослушивания за час. Условие пересказано своими словами.

  1. package plays
  2. import "sync"
  3. type Play struct {
  4. TrackID string
  5. Seconds int
  6. }
  7. // CountPlays считает прослушивания от 30 секунд по трекам.
  8. func CountPlays(batches [][]Play) map[string]int {
  9. counts := make(map[string]int)
  10. var wg sync.WaitGroup
  11. for _, batch := range batches {
  12. go func() {
  13. wg.Add(1)
  14. defer wg.Done()
  15. for _, p := range batch {
  16. if p.Seconds >= 30 {
  17. counts[p.TrackID]++
  18. }
  19. }
  20. }()
  21. }
  22. wg.Wait()
  23. return counts
  24. }