Sobes.tech
Back to questions
Junior — Middle
91

Каким образом можно принудительно остановить сразу несколько работающих горутин в Go?

Answer from AI

sobes.tech AI

В Go для принудительной остановки нескольких работающих горутин обычно используют механизм отмены через контекст (context.Context).

Основная идея:

  • Создаётся контекст с отменой (context.WithCancel или context.WithTimeout).
  • Каждая горутина принимает этот контекст и периодически проверяет, не отменён ли он.
  • При вызове функции отмены (cancel()) все горутины получают сигнал и могут корректно завершиться.

Пример:

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

for i := 0; i < 5; i++ {
    go func(id int) {
        for {
            select {
            case <-ctx.Done():
                fmt.Printf("Горутина %d остановлена\n", id)
                return
            default:
                // работа горутины
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Через некоторое время останавливаем все горутины
time.Sleep(1 * time.Second)
cancel()

// Ждём завершения (например, через sync.WaitGroup)

Такой подход позволяет централизованно управлять остановкой нескольких горутин и избегать проблем с неконтролируемым завершением.