Sobes.tech
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'дердин борборлоштурулган токтотулушун камсыздайт жана көзөмөлсүз аяктоонун көйгөйлөрүн алдын алат.