Senior
Ինչպես կառավարել կոնտեքստի չեղարկումը այնպես, որ բոլոր աշխատողները անմիջապես կանգ առնեն կոնտեքստի չեղարկումից հետո: Ինչպես օգտագործել select-ը կոնտեքստը հաշվի առնելով՝ ընթերցելու համար from a channel?
sobes.tech AI
Պատասխան 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() все воркеры сразу получат сигнал и завершат работу без задержек.