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

8. Пул воркеров для рассылки push

Сложная

Go · 47 строк

SendAll получает пачку из 50 тысяч push и число воркеров, обычно 32. Каждый воркер вызывает send и пишет результат в канал.

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

В работе: Массовая рассылка push о новых условиях по вкладам.

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

Источник: на задачах Сбера: push-уведомления в СберБанк Онлайн. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package push
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. type Push struct {
  7. Token string
  8. Text string
  9. }
  10. type Result struct {
  11. Token string
  12. Err error
  13. }
  14. // SendAll рассылает push клиентам через пул воркеров.
  15. func SendAll(pushes []Push, workers int, send func(Push) error) []Result {
  16. jobs := make(chan Push)
  17. results := make(chan Result)
  18. var wg sync.WaitGroup
  19. for i := 0; i < workers; i++ {
  20. go func() {
  21. wg.Add(1)
  22. defer wg.Done()
  23. for p := range jobs {
  24. results <- Result{Token: p.Token, Err: send(p)}
  25. }
  26. }()
  27. }
  28. for _, p := range pushes {
  29. jobs <- p
  30. }
  31. wg.Wait()
  32. close(results)
  33. var out []Result
  34. for r := range results {
  35. out = append(out, r)
  36. }
  37. fmt.Printf("отправлено %d из %d\n", len(out), len(pushes))
  38. return out
  39. }