Middle+
Акыркы ката тууралуу айтып бер — эмне болду, кантип таптыңыз жана кантип чечтиңиз?
sobes.tech AI
AIден жооп
Go программасынын акыркы долбоорлорунун биринде, параллелдүү суроолордун көптүгүн иштеткен кызматта эс тутум агуу маселесине туш болдук. Жүйө акырындык менен жайлай баштады жана акырында эс тутумдун жетишсиздиги катасы менен кулады.
Маселе — goroutine'лерди туура эмес колдонуу: ар бир суроо үчүн goroutine ишке киргизип жаттык, бирок алардын аяктоо процессин көзөмөлдөбөйбүз жана контекстке байланыштуу ресурстарды бошотпойбуз.
Маселе pprof профайлери аркылуу аныкталды, ал goroutine'лердин санынын жана эс тутумдун керектелишинин өсүшүн көрсөттү.
Чечим:
- Goroutine'лер үчүн убакыт чектөө жана жокко чыгуу менен контекст кошулду.
- Суроолорду иштетүүнү кайра жаздык, goroutine'лердин аяктоо процессин камсыз кылуу үчүн.
- Бир убакта иштеп жаткан goroutine'лердин максималдуу санын чектөө үчүн пул киргиздик.
Goroutine'ни жокко чыгуу үчүн контекстти колдонуу мисалы:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// тазалоо жана аяктоо
return
// иштетүү
}
}(ctx)