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

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию на Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

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

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