Üç bölümden oluşan bir uygulamanın tasarımı üzerinde çalışıyorum:
- belirli olayları izleyen tek bir iş parçacığı (dosya oluşturma, dış istekler vb.)
- Bu olaylara işleyerek yanıt veren N çalışan iş parçacığı (her çalışan tek bir olayı işler ve tüketir ve işleme değişken zaman alabilir)
- bu iş parçacıklarını yöneten ve hata işleme (denetleyicilerin yeniden başlatılması, sonuçların kaydedilmesi) yapan bir denetleyici
Bu oldukça basit ve uygulanması zor olmasa da, bunu yapmanın "doğru" yolunun ne olacağını merak ediyorum (Java'daki bu somut durumda, ancak daha yüksek soyutlama cevapları da takdir edilmektedir). İki strateji akla geliyor:
Gözlemci / Gözlemlenebilir: İzleyen iplik denetleyici tarafından izlenir. Bir olay olması durumunda, denetleyici bilgilendirilir ve yeni görevi yeniden kullanılabilir önbelleğe alınmış bir iş parçacığı havuzundan ücretsiz bir iş parçacığına atayabilir (veya tüm iş parçacıkları şu anda meşgulse FIFO kuyruğundaki görevleri bekleyebilir ve önbelleğe alabilir). Çalışan iş parçacıkları Callable uygular ve sonuçla (veya bir boole değeriyle) başarılı bir şekilde döndürür veya bir hata ile geri döner; bu durumda denetleyici ne yapılacağına karar verebilir (meydana gelen hatanın niteliğine bağlı olarak).
Yapımcı / Tüketici : İzleme iş parçacığı bir BlockingQueue'yu denetleyiciyle (olay kuyruğu) paylaşır ve denetleyici ikisini tüm çalışanlarla (görev kuyruğu ve sonuç kuyruğu) paylaşır. Bir olay olması durumunda, izleme dizisi olay kuyruğuna bir görev nesnesi koyar. Denetleyici olay kuyruğundan yeni görevler alır, bunları inceler ve görev kuyruğuna koyar. Her işçi yeni görevleri bekler ve bunları görev kuyruğundan alır / tüketir (önce önce servis yapılır, kuyruğun kendisi tarafından yönetilir), sonuçları veya hataları sonuç kuyruğuna geri koyar. Son olarak, kontrolör sonuçları sonuç kuyruğundan alabilir ve hata durumunda uygun adımları atabilir.
Her iki yaklaşımın da sonuçları benzerdir, ancak her birinin küçük farklılıkları vardır:
Gözlemciler ile, iş parçacıklarının kontrolü doğrudandır ve her görev belirli bir yeni doğmuş işçiye atfedilir. İş parçacığı oluşturmak için ek yük daha yüksek olabilir, ancak önbelleğe alınmış iş parçacığı havuzu sayesinde çok fazla değil. Öte yandan, Gözlemci modeli, tam olarak ne için tasarlandığı değil, çoklu yerine tek bir Gözlemciye indirgenir.
Kuyruk stratejisinin genişletilmesi daha kolay görünüyor, örneğin bir yerine birden çok üretici eklemek basittir ve herhangi bir değişiklik gerektirmez. Dezavantajı, herhangi bir iş yapmasa bile tüm iş parçacıklarının süresiz olarak çalışması ve hata / sonuç işlemenin ilk çözümdeki kadar zarif görünmemesidir.
Bu durumda en uygun yaklaşım ne olabilir ve neden? Bu sorunun cevabını çevrimiçi olarak bulmakta zorlandım, çünkü çoğu örnek yalnızca çok sayıda pencereyi Gözlemci durumunda yeni bir değerle güncellemek veya birden fazla tüketici ve üretici ile işlem yapmak gibi açık vakalarla ilgilidir. Herhangi bir girdi büyük beğeni topluyor.