Junior — Middle
Go тилинде иштеп жаткан бир нече goroutine'лерди күч менен токтотуу кандай?
sobes.tech AI
AIден жооп
Go тилинде, иштеп жаткан бир нече goroutine'ду күч менен токтотуу үчүн көбүнесе контекст (context.Context) аркылуу жокко чыгаруу механизми колдонулат.
Негизги идея:
- Жокко чыгаруу менен контекст түзүлөт (
context.WithCancelжеcontext.WithTimeout). - Ар бир goroutine бул контекстти кабыл алып, аны үзгүлтүксүз текшерип турат.
- Жокко чыгаруу функциясы (
cancel()) чакырылганда, бардык goroutine'дер сигнал алат жана туура аяктай алат.
Мисал:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Goroutine %d токтотулду\n", id)
return
default:
// goroutine иши
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Бир убакыттан кийин бардык goroutine'дерди токтотуу
time.Sleep(1 * time.Second)
cancel()
// Аякталышын күтүп турабыз (мисалы, sync.WaitGroup аркылуу)
Бул ыкма көптөгөн goroutine'дердин борборлоштурулган токтотулушун камсыздайт жана көзөмөлсүз аяктоонун көйгөйлөрүн алдын алат.