Junior — Middle
Чӣ гуна метавон чанд goroutine-ро дар Go маҷбурӣ боздошт?
sobes.tech AI
Ҷавоб аз AI
В Go, за принудително спиране на няколко работещи горутин, обикновено се използва механизъм за отменяне чрез контекст (context.Context).
Основната идея:
- Създава се контекст с отменяне (
context.WithCancelилиcontext.WithTimeout). - Всяка горутина получава този контекст и периодично проверява дали е отменен.
- При извикване на функцията за отменяне (
cancel()), всички горутини получават сигнала и могат да се затворят правилно.
Пример:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Горутината %d е спряна\n", id)
return
default:
// работа на горутината
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// След известно време спираме всички горутини
time.Sleep(1 * time.Second)
cancel()
// Изчакваме да приключат (например чрез sync.WaitGroup)
Този подход позволява централизирано управление на спирането на няколко горутини и избягва проблеми с неконтролирано приключване.