Sobes.tech
Junior — Middle

Как правилно да спрете изпълняваща се goroutine, ако е необходимо да приключи въз основа на външен сигнал или условие, дори ако резултатът все още не е получен?

sobes.tech AI

Отговор от AI

За правилното спиране на изпълняваща се горутина по външен сигнал или условие в Go обикновено се използват контекст (context.Context) или канали за предаване на сигнала за прекратяване.

Пример с използване на контекст:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Получен сигнал за прекратяване, приключване на горутината
            return
        default:
            // Изпълнение на работа
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // В някакъв момент извикваме cancel() за да спрем горутината
    cancel()
}

Този подход позволява на горутината редовно да проверява дали е изпратен сигнал за спиране и да се затваря правилно, дори ако резултатът все още не е получен. По същия начин може да се използва канал за предаване на сигнала за спиране, но context е по-идиоматичен и удобен начин в Go.