Нужен компонент, который быстро принимает задачи, по запросу отдаёт их статус
и результат и при этом гарантирует, что тяжёлый Process выполняется не
больше чем в threads потоков одновременно.
type Processor interface {
Process(payload []byte) ([]byte, error)
}
type ID string
const (
StatusQueued = "queued" // принята, ждёт свободного потока
StatusRunning = "running" // Process выполняется
StatusDone = "done" // Process вернул результат без ошибки
StatusFailed = "failed" // Process вернул ошибку
)
var ErrNotFound = errors.New("job not found")
func NewScheduler(proc Processor, threads int) *Scheduler
// Enqueue ставит задачу и сразу возвращает её ID.
func (s *Scheduler) Enqueue(payload []byte) ID
// Status отдаёт статус задачи; result — только для done, err — только для failed.
func (s *Scheduler) Status(id ID) (status string, result []byte, err error)
// Close дожидается выполнения всех принятых задач и освобождает горутины.
func (s *Scheduler) Close()
Требования
Enqueue никогда не блокируется, сколько бы задач ни ждало в очереди и
чем бы ни были заняты потоки. Очередь не ограничена.
- ID уникальны, в том числе при конкурентных
Enqueue из многих горутин.
- Одновременно выполняется не больше
threads вызовов Process
(threads < 1 считается как 1), и при достаточном числе задач лимит
реально достигается.
Status не блокируется, даже пока идут долгие Process.
Статус задачи проходит queued → running → done | failed.
Неизвестный ID — "", nil, ErrNotFound.
Close возвращается, когда все принятые задачи завершены; после него в
планировщике нет горутин. Enqueue после Close не вызывается.
- Код проходит
go test -race.
Пример
s := NewScheduler(resizer, 4)
id := s.Enqueue(img)
st, _, _ := s.Status(id) // "queued" или "running"
// … позже
st, out, err := s.Status(id) // "done", <результат>, nil
s.Close()
Устно: как ограничить число параллельных обработок без пула воркеров
(канал-семафор)? Что будет с памятью, если задачи приходят быстрее, чем
обрабатываются, и как это ограничить? Когда удалять результаты из памяти?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.