Sobes.tech
Назад к вопросам
Junior — Middle
77

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

Ответ от нейросети

sobes.tech AI

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

Пример с использованием context:

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func worker(ctx context.Context, wg *sync.WaitGroup, id int) {
    defer wg.Done()
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("Worker %d stopping\n", id)
            return
        default:
            // Выполнение работы
            fmt.Printf("Worker %d is working\n", id)
            time.Sleep(500 * time.Millisecond)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(ctx, &wg, i)
    }

    time.Sleep(2 * time.Second)
    cancel() // сигнал остановки для всех горутин
    wg.Wait()
    fmt.Println("All workers stopped")
}

Здесь context.WithCancel создаёт контекст с функцией отмены. Горутии слушают сигнал ctx.Done(), чтобы корректно завершиться. Это позволяет централизованно управлять остановкой группы горутин.