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)
Такой подход позволяет централизованно управлять остановкой нескольких горутин и избегать проблем с неконтролируемым завершением.