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