Реализуйте пул воркеров с приоритетной очередью. Воркеры всегда первыми
выбирают задачи с наивысшим доступным приоритетом. Метод Submit не должен
блокировать вызывающую сторону.
type Task struct {
Priority int // 1..3, где 3 — наивысший
Run func()
}
type PriorityPool struct {
// ...
}
// NewPriorityPool создаёт пул из workers воркеров.
func NewPriorityPool(workers int) *PriorityPool
// Submit добавляет задачу в очередь. Не блокирует вызывающую сторону.
func (p *PriorityPool) Submit(t Task)
// Start запускает воркеры.
func (p *PriorityPool) Start()
// Stop дренирует очередь и останавливает пул.
func (p *PriorityPool) Stop()
Требования:
- Воркеры выбирают задачу с наивысшим приоритетом из доступных.
Submit не блокирует вызывающего (очередь растёт динамически).
- Реализация через
container/heap или приоритетные корзины + sync.Cond.
Stop() дожидается выполнения всех уже принятых задач и завершает воркеры.
На что смотрит интервьюер:
- Корректная приоритетная диспетчеризация (heap или buckets +
sync.Cond).
Submit неблокирующий — нет дедлока на стороне вызывающего.
- Безопасный доступ к очереди под мьютексом, корректное использование
sync.Cond (Wait/Signal/Broadcast).
- Отсутствие гонок под
-race, отсутствие утечек горутин после Stop().
- Аккуратное завершение: дренаж очереди и пробуждение всех воркеров.