golang как остановить горутину

Аватар пользователя Даниил Першин
Даниил Першин
02 апреля 2023

В 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. После завершения работы горутины, программа завершается.

0 0
Аватар пользователя Aleks Teroni
Aleks Teroni
15 июля 2023

А если в default поставить time.Sleep(9999999999 * time.Second), через сколько завершится программа?

    default:
        // Выполнение работы в горутине
        fmt.Println("Работаю...")
        time.Sleep(9999999999 * time.Second)
0 0
Познакомьтесь с основами Go бесплатно

Похожие вопросы

1
ответ
27 марта 2023
1
ответ