Sobes.tech
Junior — Middle

Kako na silu zaustaviti više pokrenutih gorutina u Go?

sobes.tech АИ

Одговор од АИ

У Go-у, за принудно заустављање више активних goroutine-ова, обично се користи механизам отказа преко контекста (context.Context).

Главна идеја:

  • Креира се контекст са отказом (context.WithCancel или context.WithTimeout).
  • Сваку goroutine прихвата овај контекст и периодично проверава да ли је отказан.
  • При позиву функције за отказ (cancel()), све goroutine-ове добијају сигнал и могу се правилно завршити.

Пример:

ctx, cancel := context.WithCancel(context.Background())

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Goroutine %d заустављена\n", id)
                return
            default:
                // рад goroutine-а
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// После одређеног времена, заустављамо све goroutine-ове
time.Sleep(1 * time.Second)
cancel()

// Чекамо да се заврше (нпр. коришћењем sync.WaitGroup)

Овај приступ омогућава централизовано управљање заустављањем више goroutine-ова и избегава проблеме са неконтролисаним завршетком.