C# ile Paralel Programlama-4 (Producer Consumer Pattern)

İlker Erhalim
2 min readJan 8, 2021
Breakingpic adlı kişinin Pexels’daki fotoğrafı

Producer consumer pattern, adından da anlaşılacağı gibi, bir yandan yeni bir iş üretirken diğer yandan o işleri tamamlamaya yarayan bir yaklaşımdır. .Net ortamında bu implementasyonu BlockingCollection sınıfı ile ile oldukça basit bir şekilde yapabiliriz.

BlockingCollection ile bir koleksiyona belirtilen bir limit dahilinde bir yandan eleman eklerken diğer yandan o elemanlar ile istenilen işler yapılıp koleksiyondan silinebilinir. Bir önceki yazımda bahsettiğim eş zamanlı koleksiyon sınıfları IProducerConsumerCollection interfaceini implement eder, bu interfacei implement etmiş olan tük koleksiyonları BlockingCollection içinde kullanabiliriz.

Diyelim ki farklı farklı clientlar ile UDP bağlantısı kuran bir soket sunucumuz var. Sunucu gelen veriyi parse edip belirli fonksiyonlardan geçirip bir veri kaynağına yazıyor ve bu işlem ortalama 100 milisaniye sürüyor, ancak her bir client 10 saniyede bir veri gönderiyor ve binden fazla client mevcut. Bu sunucu, soketi dinlediği task içerisinde veriyi işlerse yeni gelen istekleri karşılayamayacak. Her gelen istek için yeni bir task açıp işlemleri bu task içerisinde yaparsa sunucu üzerinde kontrolsüz bir şekilde iş yapan çok fazla task olacak ve işin içinde bir veri kaynağıda olduğu için bu veri kaynağına erişimlerin eş zamanlı yapılması gerekecek. Eş zamanlama için kullanılan yönteme göre farklı farklı problemler doğacak.

Yukarıdaki senaryonun implementasyonu Producer Consumer Pattern ile yapılırsa gelen veriyi işleyecek task sayısı yönetilebilinir. İsteklerde bir yığılma olduğunda ham veriler bir kuyruğa eklenip sıra ile işlenebilinir.

Yukarıdaki senaryo karmaşık olacağı ve esas konudan sapmaya sebep olacağı için daha basit bir implementasyon örneği hazırladım.

Yukarıdaki örnekte bir Task içerisinde 300 tane iş üretiliyor (GenerateText) ve bir diğerinde (TextOperation) o işler eritiliyor.

--

--