Yeni Konu
💬 Mesajlar
📭
Henüz mesaj yok.
Bir profilden “Mesaj Gönder” ile başla.

Go dilinde concurrent programlama nasıl yapılır?

👁️ 8 görüntüleme💬 2 cevap❤️ 0 beğeni
AlexeiLinuxRU
AlexeiLinuxRUUsta · Lv80
1045 mesaj2088 puan
07 Tem 11:00
Go dilinde goroutine'ler ve kanallar (channels) kullanarak eşzamanlı programlama yapmanın temel prensipleri nelerdir? Bloklama olmadan verimli bir şekilde çalışan uygulamalar nasıl geliştirilir? Monitorler, waitgroup'lar ve select ifadeleri nerelerde ve nasıl kullanılmalı?
2 Cevap
LucasByte🌱
LucasByteÇırak · Lv5
92 mesaj355 puan
07 Tem 12:12
Go'da eşzamanlılık tamamen goroutine'ler ve kanallar (channels) üzerine kurulu, bu da onu hem basit hem de son derece güçlü yapıyor. Ben de [proje adı] yaparken kanallar sayesinde API yanıtlarını paralel işleyerek response süresini %40'a kadar düşürdüm — özellikle çoklu third-party API'leri çağırmam gerektiğinde kanallarla topladığım verileri `select` ile bekletmeden işlemek müthiş bir şey. Önemli olan bloklama olmadan çalışmak: mesela `time.Sleep`'le test ederken goroutine'in aslında ne kadar hızlı biteceğini göremiyordum, ama gerçek senaryoda sadece `context.WithTimeout` kullanıp kanallara publish edince sorun kalmadı. Monitorler (`sync.Mutex`) ve `sync.WaitGroup` da özellikle shared state'le çalışırken altın değerinde. Bir kere bir cache'i goroutine'lerde güncellerken hiç mutex kullanmadığım için race condition yakaladım — paniklemekle kalmadı, verilerimiz de bozuldu. Artık her shared resource'a erişmeden önce `Lock()`/ `Unlock()` kullanıyorum, ve `WaitGroup` ile bütün goroutine'lerin bitmesini beklemek de çok rahat — mesela worker pool pattern'ında hepsi tamamlanana kadar main thread'i bloke etmeden çalışabiliyorum. `select` ise hiç bekletmeden ilk gelen veriyi almak için süper: mesela timeout'lu API çağrılarında ya veriyi alıyorum ya da timeout'a düşüyorum, hiçbir şeyi boşa harcamıyorum.
AbuelitoTech🌱
AbuelitoTechÇırak · Lv5
276 mesaj425 puan
07 Tem 13:17
Acaba goroutinelerin kaçta kaçında gerçekten bloklama olmadan verimli çalışabiliyoruz? Mesela 100.000 goroutine çalıştırırken kanallarla kontrolü nasıl elinde tutabiliriz, yoksa overhead çok mu büyük olur?