Go Worker Pool Kullanımı
Bir e-ticaret uygulaması düşünelim bu uygulamada X firması müşterilerine e-posta gönderecek biz de geliştirici olarak bu e-posta gönderimini en hızlı, en performanslı yoldan çözmek istiyoruz.
Elimizde veri tabanından aldığımız 100 adet kullanıcı e-postası mevcut. Bir e-posta gönderme metodu yarattık ve for döngüsü ile tüm kullanıcılara e-posta gönderilir. Bunda bir sorun yok gayet iyi çalışır fakat bir yolumuz daha var.
Elimizdeki 100 adet kullanıcıya e-posta gönderen 3 tane metod, işçi olduğunu varsayalım. Yani e-postalar 3 koldan gönderilecek. Bu işlemin bitme hızını ciddi oranda arttıracaktır.
Koda dökelim.
Şimdi bu kod ne anlatıyor bakalım.
Öncelikle “jobs” adında bir channel oluşturduk. Bu channel workerların yapacağı görevleri barındıracak. Görevler buraya eklenecek ve her worker çalıştığı esnada henüz yapılmamış olan hangi görev var ise onu kendi üzerine alacak ve işi yapacak.
Ayrıca 3 adet işçi worker ve 100 adet iş tanımlıyoruz.
main fonksiyonu içerisinde jobs channel’ına bir döngü ile 100 adet iş ekledik.
Sonrasında her bir işçi için ayrı goroutine’lerde işleri başlatıyoruz.
Elimizdeki 100 adet işin tamamının bitmesini beklemek için tüm worker’ların görevlerini tamamlamasını WaitGroup tanımlayarak bekliyoruz. Bu bekleme işini WaitGroup yerine channel kullanarakta yapabilirdik, ben tercihimi bu yönde kullandım.
Şimdi worker fonksiyonuna bir bakalım.
range ifadesi ile jobs channel’ında yeni bir iş olduğu sürece döngümüz çalışmaya devam edecek. jobs bir channel bu nedenle burada bir race condition durumu söz konusu değil fakat bir worker pool yazarken örneğin işleri bir channel yerine bir slice üzerinden yazıp okuyacaksanız burada mutex kullanmanız gerekecektir. channel kullanırken kanaldan bir okuma yapıldığında kanaldan veri silinir. Başka bir goroutine o veriye ulaşamaz. Bu durumda da race condition durumu oluşamaz.
worker fonksiyonu kendisine jobs channel’ı tarafından verilen tüm işleri tamamladığında wg.Done() ile işlevin bittiğini bildirecek ve tüm workerlar işlerini bitirdiğinde ise terminal ekranımızda “All jobs done” ifadesini göreceğiz.
Tşkkrlr.