Go dilinde Concurrency ve WaitGroup kullanımı

Melih Sivri
3 min readAug 12, 2021

--

Merhaba, bu yazımda dilim döndüğünce “Go dilinde WaitGroup’lar ne işe yarar ve nasıl kullanabiliriz ?” sorusunu yanıtlayacağım. Ufaktan başlayalım.

Öncelikle Go’da bize concurrent (eşzamanlı) fonksiyonlar çalıştırma imkanı veren goroutine’den bahsedelim. Goroutine işletim sistemi seviyesinde, düşük maliyetli, thread benzeri yapılar oluşturmamızı sağlayan Go dilinin sunduğu nimetlerden biridir. Ve bunu kullanmak için de tek yapmanız gereken eşzamanlı hale getirmek istediğiniz işlemlerin başına “go” ifadesini eklemek.

Aşağıdaki görselde basit bir örnek verilmiştir.

Bu koddan beklenen konsola sırası farketmeksizin “app started”, “concurrent func 1”, “concurrent func 2”, “app finished” yazmasıdır. Bakalım öyle mi oluyor.

Gördüğünüz gibi bizim func1() ve func2() fonksiyonlarımız hiç çalışmamış bile. Bunun sebebi bizim hali hazırda çalışan main goroutine’imizin haricinde 2 goroutine daha başlatmamış olmamız. Ancak bizim main goroutine’imiz biz aksini söylemediğimiz sürece sadece kendi işini bitirip, yani ekrana “app started” ve “app finished” yazıp tamamlanacak ve diğer goroutinelerin tamamlanmasını beklemeyecek. Peki bunu çözmek için ne yapabiliriz ? İki yolumuz var

1- time.Sleep() kullanmak

Koda time.Sleep() ekleyerek main goroutine’imizin 1 saniye uyumasını sağladık. Ve bu uyku esnasında diğer goroutine’ler işini tamamladı ve ortaya şöyle bir sonuç çıktı.

Evet istediğimiz şeyi aldık. Tüm goroutine’ler üstüne düşeni yaptı ve uygulamamız tamamlandı. Ancak burada sıkıntılı bir durum ortaya çıkıyor. Milisaniyelerin bile önemli olduğu uygulamalarda bir goroutine’i 1 saniye boyunca uyutmak oldukça ciddi bir verim kaybı olurdu. İşte bu noktada yardımımıza asıl konumuz olan WaitGroup yetişiyor.

2- sync.WaitGroup kullanmak

Kodu açıklamak gerekirse başta “wg” adında bir WaitGroup tanımladık. Daha sonra wg.Add(2) diyerek 2 adet goroutine oluşturacağımızı söyledik ve WaitGroup’umuzun pointer’ını func1 ve func2 içerisine parametre olarak gönderdik. Burası önemli, pointer olarak göndermezseniz WaitGroup beklediği uyandırma sinyallerini alamaz ve uygulamanız şöyle bir hata verir.

Her neyse tüm adımları doğru bir şekilde yazdıktan sonra yapmamız gereken şey wg.Wait() diyerek main goroutine’imizi diğer fonksiyonlardan “done” sinyali gelene kadar uyutmak olacaktır. Böylece uygulamamız sorunsuz ve gecikme yaşamadan çalışacaktır.

Böylelikle benim Medium’da paylaştığım ilk içeriğin sonuna geldik. Umarım faydalı olabilmişimdir. Geri bildirimleriniz veya sorularınız için Twitter üzerinden bana ulaşabilirsiniz. İyi çalışmalar :)

--

--