Реализуйте пул воркеров, где каждая задача привязана к собственному
context.Context. Если контекст задачи отменён во время её выполнения,
воркер должен оперативно бросить её и взять следующую задачу — не застревая.
type CtxTask struct {
Ctx context.Context
Run func(ctx context.Context)
}
type CtxPool struct{ /* ... */ }
func NewCtxPool(workers int) *CtxPool
func (p *CtxPool) Submit(t CtxTask)
func (p *CtxPool) Start()
func (p *CtxPool) Stop()
Требования:
Start запускает workers воркеров.
Submit ставит задачу в очередь.
- Каждая задача выполняется со своим
Ctx. Run обязан реагировать на
отмену контекста, а воркер не должен оставаться занятым после отмены —
он переходит к следующей задаче.
- Задача с неотменённым контекстом выполняется до конца.
Stop корректно останавливает все воркеры без утечек горутин.
На что смотрит интервьюер:
- Передача контекста задачи в
Run и реакция воркера на отмену: после
завершения Run (в т.ч. по отмене) воркер немедленно свободен.
- Воркер не блокируется навсегда из-за «зависшей» задачи — отменённая
задача освобождает воркера, и последующая нормальная задача выполняется.
- Отсутствие гонок под
-race, корректный graceful shutdown в Stop.