Herkese selam, bir diğer konumuz ise Go ile Goroutine’ler ve Channel’lar. Tekrardan bir diğer konumla burada olmaktan mutluyum iyi okumalar diliyorum. Eleştiriye her zaman açık biri olarak her insan gibi bende hata yapabilirim. konu altından saygı çerçevesinde dile getirirseniz bilgi alış-verişi/beyin fırtınası yapabilirim. :͛)͛
Şimdi öncelikle başlıklarımızdan bahsedeyim;
> Go ile Paralel Programlama: Goroutine’ler ve Channel’lar
> Go’da Paralel Programlanın Felsefesi
> Goroutine Nedir?
> Channel: Güvenli Veri İletiminin Merkezi
> Buffered ve Unbuffered Channel’lar
> Seçim Mekanizması: Select Yapısı
> Goroutine ve Channel Kullanımında En İyi Uygulamalar
> Performans ve Ölçeklenebilirlik Avantajları
Şimdi ise fazla vaktinizi çalmadan başlayalım ki sıkılmayın, iyi okumalar : D
Günümüzde yazılım ile kurulmuş sistemlerin performans gereksinimleri her geçen gün daha fazla önem kazanmaktadır. Anlık olarak gelebilecek yüksek trafik talebini karşılamak, gerçek zamanlı işlemler yürütmek ve sistem içerisindeki kaynakları en verimli şekilde kullanmak için paralel programlama bir tercih değil zorunluluktur. Go(Golang) cooncurrency (yerleşik eşzamanlılık) modeli sayesinde bu zorunlu ihtiyaca çok güçlü çözüm sunuyor. Goroutine’ler ve channel’lar, Go’nun sistem geliştirme ve yönetme aşamasındaki temel yapı taşlarıdır.
Go’da Paralel Programlanın Felsefesi
Go’nun eşzamanlılık yaklaşımı, “paylaşılan bellek üzerindeki iletişim değil, iletişim üzerindeki bellek paylaşımı” ilkesi üzerinden hareket eder. Bu ilke, karmaşık ve anlaşılmaz kilit mekanizmalarını bir kenara bırakıp veri tutarlılığını daha iyi, açık ve yönetilebilir hale getirir.
Paralel programlama kavramları:
Concurrency (Eşzamanlılık): Bir çok görevin aynı anda yönetilmesi.
Parallelism (Parallelik): Görevlerin aynı anda yürütülmesi.
Goland dilinde concurrency, parallelliğin önünü açan ve kullanımını kolaylaştıran temel yapıdır.
Goroutine Nedir?
Goroutine, Go dilinin lightweight thread (Hafif iş parçacığı) yapısıdır. İşletim sisteminin normalde kullandığı diğer thread’lere göre çok daha az bellek kullanır. Başlangıçta sadece 2 KB stack’dir ve dinamik olarak büyür. Bu sayede milyonlarca goroutine aynı anda yönetilebilir.
Goroutine başlamak için izlemeniz gereken adımlar çok basittir:
go myFunction() |
Bu satır, myFunction() fonksiyonunun aktif olarak çalışan program akışından bağımsız olarak işletmeye başlar. Go runtime, goroutine’lerin hepsini otomatik olarak CPU çekirdekleri içerisinde planlar. Geliştirici, geri kalan karmaşık thread yönetimiyle uğraşmadan kolaylıkla ilerleyebilir.
Channel: Güvenli Veri İletiminin Merkezi
Channel’lar, goroutine’ler arasındaki veri alışverişi ve iletişimi güvenli şekilde gerçekleşmesini sağlayan yapılardır. Veriler arasındaki iletişimi sağlayarak eş güdüm şekilde hareket etmeyi amaçlayıp senkronizasyon mekanizması görevi de görürler.
Channeller oluşturmak için şu komutu yazmanız gerekir:
ch := make(chan int) |
Veri gönderip almak için:
ch <- 5 // Gönderme val := <-ch // Alma |
Channel’lar sayesinde mutex(kilit) mekanizmalarına olan ihtiyaç azalır. Veri aktarımı daha düzenli ve güvenli şekilde tamamlanır.
Buffered ve Unbuffered Channel’lar
Channel’ların iki farklı kullanım türü vardır:
Buffered
Bellek alanının kapasitesi tanımlandıktan sonra gönderen taraf alıcıyı beklemesine gerek kalmadan istenilen sayıda veri iletebilir.
ch := make(chan string, 3) |
Bu yapı, akış kontrolünü sağlamak ve performans optimizasyonu için kullanılır.
Unbuffered
Alıcı ve gönderenin aynı anda hazır olması gereken yapıdır. Tam senkronizasyon sağlamaktadır.
Seçim Mekanizması: Select Yapısı
Eğer aynı anda birçok channel ile çalışılıyorsa select, concurrency yapılarını birleştirir. O an hangi channel’dan veri hazır halde gelirse o işlem yürütülür.
select { case msg := <-ch1: fmt.Println(msg) case msg := <-ch2: fmt.Println(msg) default: fmt.Println("Bekleyen veri yok") } |
Bu yapı, dayanıklı sistemler geliştirmeyi ve ölçeklenebilirliği destekler.
Goroutine ve Channel Kullanımında En İyi Uygulamalar
Başarılı ve stabil çalışan bir concurrency tasarımı için şunlara dikkat edilmelidir:
- Paylaşılan durumu channel üzerinden yönetin
- Gereksiz goroutine oluşturmayın
- Deadlock ve race condition risklerini minimalize edin
- Kapalı channel ifadelerini doğru yönetin (close() fonksiyonu)
- Uzun yaşayan servislerde context kullanımını ihmal etmeyin
Bu kurallara uyduğunuz da mikroservis ve gerçek zamanlı uygulamalarınız tutarlı performans ile çalışacaktır.
Performans ve Ölçeklenebilirlik Avantajları
Goroutine’lerin işletim sistemlerinin kullandığı thread’lara oranla sağladığı avantajlar:
- Hafıza tüketimi minimum seviyede
- Go Scheduler ile otomatik CPU yük dağılımı
- Çok düşük başlangıç maliyeti
- Binlerce eşzamanlı işlem ihtiyacında güvenilir çalışma
Bu maddeler, Go dilinin özellikle yüksek trafiğe ihtiyaç duyan servisleri güçlü bir konuma taşır.
Go ile paralel programlama sade, yalın ve kullanışlı fakat bir o kadar da güçlü bir altyapıya sahiptir. Channel’lar ise veri iletişimini düzenli ve hatasız yürütür. Bir arada kullanıldığında ise günümüz yazılım sektörünün en büyük sorunlarını ortadan kaldırarak ölçeklenebilir yüksek performans sağlayarak en verimli hale gelebilir.
Her geçen gün artan ihtiyaçlar doğrultusunda karmaşıklaşan yazılım yapılarının gelecekte daha kötü bir hale gelmesinin önüne geçerek yazılım sektörünün ihtiyaçları ufak servislere bölerek programlamasına ve dağıtık sistem olarak adlandırılan sistemlerin daha sürdürülebilir hale gelmesini sağlamaktadır. Birçok yazılım firması günümüzde ya bu sistemleri kullanmakta yada hızlıca geçmek için çalışmalara başlamaktadır. Yazılım sektörü ile ilgilenen bir çok yazılımcının da bu alana dahil olmak için bu tür işlemleri öğrenerek kendilerine yatırım yapmaktadırlar.
Bugünkü konumuz bu kadardı okuyan herkese teşekkür ederim. Bir başka konuda görüşmek üzere saygıyla ve sevgiyle kalın....
Son düzenleme:


