Bir goroutine sızıntısına və birinin necə həll edilməsinə dair bir nümunə

Kanallardan istifadə edərək bir goroutine və rabitə / ləğv kodlarında bir parça çalışan bir funksiyaya yaxınlaşdığımda ümumiyyətlə daha dərin görünməyə tələsirəm, çünki goroutine sızması təqdim etmək üçün əla yerdir və bu səhvlər olduqca asandır. Başlanğıc olmayan qolang geliştiricisi üçün belə darıxın. KUDO-da tapdığım bu kod parçası üçün etdiyim şey budur.

Goroutine sızması nədir?

Sızan goroutine, yaddaş sızmasının bir növüdür. Bir goroutine başladınız, lakin bu, heç vaxt ləğv edilməyəcək, qalıcı bir yaddaşa sahibdir. KUDO-dan göndərdiyim nümunəni bir az sadələşdirmək üçün bu, bir layihəyə goroutine sızıntısını necə təqdim edə biləcəyinizə dair bir nümunədir.

Kod nə edir ki, məcburi bir aşınma və bir goroutine içərisində dövri bir əməliyyat var. Hər bir işarə, bəzi iş məntiqlərini yoxlamağa çalışırıq (bir şeyin sağlam olduğunu / məsələn hazır olduğunu söyləyin) - bu misalda sadəcə bu çağırışı yuxu və sonra qayıtmaqla simulyasiya edir.

Bəs sızma haradadır? Yuxarıdakı sadələşdirilmiş nümunədə doğrulama əməliyyatı 10 saniyə davam edərkən, fasilənin cəmi 1 saniyədir. Bu o deməkdir ki, ilk növbədə "gözləmə rejimindən" qayıdaraq qüvvəyə minəcəkdir. 9 saniyə sonra, goroutine yoxlayıcıdan nəticə alır və görülən işlərə yazmağa çalışır. Bufersiz kanala yazmaq mane olur və heç kim bu kanalda qulaq asmır, çünki artıq gözlədik qayıtdıq - və sızıntımız budur!

Bir goroutine sızıntısını necə tapmaq olar?

Ümumiyyətlə, 'iş vaxtı' paketi burada dostunuzdur. Bir yolu, runtime.NumGoroutine () istifadə edərək, bir müddət əvvəl gözləyinReady funksiyasını çağırırıq. Gözləmədən əvvəl və sonrakı goroutines sayı eyni deyilsə, sızma var.

Başqa bir seçim Uber - goleak bir kitabxanadan istifadə etməkdir. Bunun necə həyata keçirildiyini düşünsəniz, o da iş vaxtı paketinə etibar edir, bu dəfə bütün yığışmaları (runtime.Stack funksiyası) oxuyur və bunun üzərinə bir neçə rahatlıq metodu təqdim edir.