Go · 56 строк
Перед сменой на сортировочном центре кладовщик нажимает «Печать», и PrintBatch получает до 300 отправлений. Рендер одной этикетки — HTTP-запрос в сервис шаблонов, обычно 80 мс, но иногда он висит минутами.
За сутки на сервисе набирается 40 тысяч горутин, а кладовщики жалуются, что кнопка «крутится» дольше 30 секунд. Отметьте строки с ошибками.
В работе: Бэкенд терминала печати этикеток на сортировочном центре.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Ozon: сортировочный центр и отправления. Условие пересказано своими словами.
Давали на собеседовании?
package labelsimport ("context""time")type Shipment struct{ ID, Address string }type Label struct {ShipmentID stringPDF []byte}type Renderer interface {Render(ctx context.Context, s Shipment) (Label, error)}// PrintBatch готовит этикетки на смену: до 300 отправлений.func PrintBatch(ctx context.Context, r Renderer, ships []Shipment) ([]Label, error) {ctx, _ = context.WithTimeout(ctx, 30*time.Second)jobs := make(chan Shipment)results := make(chan Label)errs := make(chan error)go func() {for _, s := range ships {jobs <- s}close(jobs)}()for w := 0; w < 8; w++ {go func() {for s := range jobs {l, err := r.Render(context.Background(), s)if err != nil {errs <- errreturn}results <- l}}()}var labels []Labelfor len(labels) < len(ships) {select {case l := <-results:labels = append(labels, l)case err := <-errs:return nil, err}}return labels, nil}