golang как остановить горутину
В Go горутины могут быть остановлены только с помощью средств, предоставляемых самим языком. Все остановки горутин должны осуществляться добровольно и контролируемо.
Самый распространенный способ остановки горутины - это использование каналов для передачи сообщений. Вы можете создать канал, который будет использоваться для передачи сигналов об остановке горутины, и проверять его состояние в теле горутины. Если состояние канала указывает на необходимость остановки, горутина должна корректно завершить свою работу и выйти.
Вот пример кода, который демонстрирует использование канала для остановки горутины:
package main
import (
"fmt"
"time"
)
func worker(stop <-chan bool) {
for {
select {
default:
// Выполнение работы в горутине
fmt.Println("Работаю...")
time.Sleep(1 * time.Second)
case <-stop:
// Получен сигнал об остановке
fmt.Println("Остановлен")
return
}
}
}
func main() {
// Создание канала для передачи сигналов об остановке горутины
stop := make(chan bool)
// Запуск горутины
go worker(stop)
// Ждем 5 секунд, затем отправляем сигнал об остановке
time.Sleep(5 * time.Second)
stop <- true
// Ждем завершения горутины
time.Sleep(1 * time.Second)
fmt.Println("Программа завершена")
}
В этом примере главная горутина создает канал stop и запускает горутину worker с этим каналом в качестве параметра. Горутина worker работает бесконечным циклом, выполняя свою работу, и проверяет состояние канала stop в блоке select. Если канал получает сигнал об остановке, горутина завершает работу и возвращает управление. Главная горутина отправляет сигнал об остановке через канал stop после 5 секунд ожидания и ждет завершения горутины worker. После завершения работы горутины, программа завершается.
А если в default поставить time.Sleep(9999999999 * time.Second), через сколько завершится программа?
default:
// Выполнение работы в горутине
fmt.Println("Работаю...")
time.Sleep(9999999999 * time.Second)