Назад к вопросам
Senior
3
Как обработать context cancel так, чтобы все воркеры немедленно остановились при отмене контекста? Как использовать select для чтения из канала с учётом контекста?
Компании, где спрашивали
А7
Ответ от нейросети
sobes.tech AI
Для немедленной остановки всех воркеров при отмене контекста в Go, каждый воркер должен слушать сигнал отмены через канал ctx.Done(). Использование select позволяет одновременно ждать данных из рабочего канала и сигнал отмены контекста.
Пример:
func worker(ctx context.Context, jobs <-chan Job) {
for {
select {
case <-ctx.Done():
// Контекст отменён — завершаем работу
return
case job, ok := <-jobs:
if !ok {
// Канал закрыт — завершаем работу
return
}
// Обработка job
process(job)
}
}
}
// В основном коде создаём контекст с отменой
ctx, cancel := context.WithCancel(context.Background())
// Запускаем воркеров
for i := 0; i < numWorkers; i++ {
go worker(ctx, jobs)
}
// При необходимости отмены вызываем cancel()
cancel()
Такой подход гарантирует, что при вызове cancel() все воркеры сразу получат сигнал и завершат работу без задержек.