Перейти к содержимому

(код без описания)

go · basicsYandex / Яндекс (3й этап)4 кв 2025не решено

(код без описания)

const MaxItems = 9999
type Producer interface {
// Next returns:
// - batch of items to be processed
// - cookie to be commited when processing is done
// - error
Next() (items []any, cookie int, err error)
// Commit is used to mark data batch as processed
Commit(cookie int) error
}
type Consumer interface {
Process(items []any) error
}
func Pipe(p Producer, c Consumer) error {
var buf []any
var cookies []int
for {
items, cookie, err := p.Next()
if err != nil {
return fmt.Errorf("Producer errors: %w ", err)
}
if len(buf)+len(items) <= MaxItems {
buf = append(buf, items...)
cookies = append(cookies, cookie)
continue
}
err := c.Process(buf)
if err != nil {
return fmt.Errorf("Consumer errors: %w ", err)
}
for i, v := range cookies {
err := p.Commit(v)
if err != nil {
return fmt.Errorf("Not commit: %w ", err)
}
}
buf = []any
buf = append(buf, items...)
cookies = []int
cookies = append(cookies, cookie)
}
return nil
}

Источник: Yandex / Яндекс (3й этап) · 4 кв 2025

← Нам нужно передать данные из некоторого… · Все задачи · Go · Процессор - сервис, который выполняет д… →