Sobes.tech
Junior — Middle

Как правилно да спрете изпълнението на goroutines с помощта на контекст в Go?

sobes.tech AI

Отговор от AI

За правилното спиране на goroutine в Go често се използва пакета context. Създава се контекст с възможност за анулиране (context.WithCancel), който се предава на goroutine. Вътре в goroutine, състоянието на контекста се проверява периодично чрез <-ctx.Done(). Когато се извика функцията за анулиране, каналът Done() се затваря, и goroutine-ът може да завърши правилно.

Пример:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine спряна")
            return
        default:
            // изпълнение на работа
        }
    }
}

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

    // след известно време спираме goroutine
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // за да има време goroutine-ът да завърши
}

Този подход позволява безопасно и контролирано спиране на goroutine-ите без използването на опасни методи.