Senior
Wie man die Kontextabbruch so handhabt, dass alle Worker sofort stoppen, wenn der Kontext abgebrochen wird? Wie man select verwendet, um aus einem Kanal unter Berücksichtigung des Kontexts zu lesen?
sobes.tech KI
Antwort von 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() все воркеры сразу получат сигнал и завершат работу без задержек.