Sobes.tech
Senior

Hoe handel je het annuleren van de context zodat alle workers onmiddellijk stoppen bij het annuleren van de context? Hoe gebruik je select om te lezen uit een kanaal met inachtneming van de context?

sobes.tech AI

Antwoord van 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() все воркеры сразу получат сигнал и завершат работу без задержек.