Java tabanlı bir Web Uygulamasında, Tek Başına Java Uygulamasında çoklu iş parçacığı nasıl farklıdır?


13

Java için oldukça yeniyim ve deneyimim, bir Web Kapsayıcısında (benim durumumda Jboss) çalışan Web Tabanlı Uygulamalar ile sınırlıdır.

Web Uygulamaları için web kapsayıcısının çoklu iş parçacığına dikkat ettiğini söylerken doğru muyum? Öyleyse, Web Tabanlı uygulamalara yeni basamaklar ekleyebilir miyim? Bunu yapmanın herhangi bir avantajı var mı ve hangi senaryoda bunu yapmak gerekir?


EE6 Kadar Konu Kullanmayacaksınız; EE7 tanıtıyor Concurrency Utilities.
Monica'yı eski durumuna getirin - M. Schröder

Yanıtlar:


20

Web Uygulamaları için web kapsayıcısının çoklu iş parçacığına dikkat ettiğini söylerken doğru muyum?

Çoğu web sunucusu (Java ve JBoss dahil başka türlü) "istek başına bir iş parçacığı" modelini izler, yani her HTTP isteği tam olarak bir iş parçacığı tarafından tam olarak işlenir. Bu iş parçacığı çoğu zaman DB istekleri gibi şeyleri bekleyerek geçirir. Web kapsayıcısı gerektiğinde yeni iş parçacıkları oluşturur.

Bazı sunucular (Java ekosisteminde öncelikle Netty ), "tek bir iş parçacığı her şeyi yapar" modeliyle veya daha karmaşık bir şeyle eşzamansız istek işleme yapar. Temel fikir, çok sayıda bekleyen iş parçacığına sahip olmanın kaynakları boşa harcamasıdır, bu nedenle eşzamansız olarak çalışmak daha verimli olabilir.

Öyleyse, Web Tabanlı uygulamalara yeni basamaklar ekleyebilir miyim?

Bu mümkündür, ancak çok dikkatli bir şekilde yapılmalıdır, çünkü hatalar (bellek sızıntıları veya eksik senkronizasyon gibi) çoğaltılması çok zor olan hatalara neden olabilir veya tüm sunucuyu yıkabilir.

Bunu yapmanın herhangi bir avantajı var mı ve hangi senaryoda bunu yapmak gerekir?

Avantajı, paralel olarak bir şeyler yapabilmenizdir. Saf hesaplama hızını artırmak için konuları kullanarak gereken bir şeydir değil diğer isteklerin işleme yavaşlatmak gibi bir web sunucusu üzerinde yapmak. Bu tür bir şey, muhtemelen bir tür iş kuyruğu kullanılarak ayrı bir sunucuda yapılmalıdır.

Başka ağ kaynaklarına erişmeniz gerekiyorsa, örneğin birkaç farklı web hizmetini çağırmanız gerekiyorsa, bir HTTP isteğini işleme bağlamında çok iş parçacığına yönelik meşru bir senaryo olabilir. Bunu tek bir thrad'da yaparsanız, her çağrının sırayla bitmesini beklemeniz gerekir. Ancak birden fazla iş parçacığı kullanırsanız, toplam bekleme süresi yalnızca en yavaş tek aramanın gecikmesidir.


3
Mantıklı. ExecutorService arabirimi bir web uygulamasında yeni iş parçacıkları oluşturmanın en iyi yolu mudur?
kapricanon

4
@kapricanon: evet, işleyemediği bazı özel gereksinimleriniz yoksa veya web sunucunuzda benzer bir şey yoksa.
Michael Borgwardt

2

Sorunuza yanıt olarak:

Java tabanlı bir Web Uygulamasında, Tek Başına Java Uygulamasında çoklu iş parçacığı nasıl farklıdır?

Farklı değil. Genellikle üzerinde kurulu olan yazılım web uygulamaları, her yeni isteği bir iş parçacığı haline getirerek zaten çok sayıda iş parçacığı oluşturacaktır. Tarafından / diğer herhangi bir uygulama gibi iş parçacıkları kullanabilirsiniz / oluşturabilirsiniz.

Gerçekten de çoklu iş parçacığı, doğru kullanırsanız size ciddi performans artışları sağlayabilir. Ağ erişimi ve disk sürücüsü erişimi gibi G / Ç yoğun görevler için performans artışı neredeyse her zaman garanti edilir. Hesaplama açısından yoğun görevler için, sunucudaki çekirdek başına bir iş parçacığının kuralına bağlı kalmalısınız. Örneğin, çekirdeğinizin bir i7 işlemcisi varsa, hesaplama görevleri yapmak için 7 iş parçacığına bağlı kalmalısınız.

Sorunuza yanıt olarak:

Bunu yapmanın herhangi bir avantajı var mı ve hangi senaryoda bunu yapmak gerekir?

Michael Borgwart hesaplama hızını artırmak için bunu yapmamanız gerektiğini söylüyor . Bu makalede, çoklu iş parçacığının, kullanıcıların hesaplama açısından ağır bir göreve ihtiyaç duyduklarında yanıt verebilmelerine yardımcı olabileceği düşünüldüğüne katılmıyorum . Sade İngilizce olarak, kullanıcılar çok iş parçacıklı hesaplama ile ağır görevleri tamamlamak için beklemek zorunda kalmayacaklar.

Eğer çok iş parçacığı kullanmak istiyorsanız, ben bir iş parçacığı havuzu kullanmanızı öneririz. Bu, iş parçacığı oluşturma yükünü azaltır.


bu sorulan soruya nasıl cevap veriyor?
gnat

1
Cevaplar kendi değerlerine dayanmalıdır. Yorum yapmak isterseniz, önce 50 itibar puanı kazanmanız gerekir.
ChrisF

1

Peki bu güzel bir soru ve bence web uygulaması geliştirmede çalışan geliştiricilerin çoğunun açıkça çoklu kullanım kullanmadığını düşünüyorum. Uygulamanızı dağıtmak için bir uygulama sunucusu kullandığınızdan, uygulama sunucusu gelen istekler için bir iş parçacığı havuzunu dahili olarak yönettiği için bunun nedeni oldukça açıktır.

O zaman neden multithreading'i açıkça kullanıyorsunuz? Bir web uygulaması geliştiricisinin kendisini çoklu iş parçacığına maruz bırakması nedir?

Birçok isteği eşzamanlı olarak sunucuya sunmak zorunda olduğunuz büyük ölçekli bir uygulama üzerinde çalışırken, belirli bir istek türü, uygulamanızın performansını düşürebilecek çok fazla işlem yapıyor olabileceğinden, her türlü isteği eşzamanlı olarak sunmak zordur.

Belirli bir istekte bulunduktan sonra bir web uygulamasının kullanıcıları e-posta ve SMS ile bilgilendirmesi gerektiğine bir örnek verelim. İstek iş parçacığıyla eşzamanlı olarak yapılması, web uygulamanızın performansını düşürebilir. İşte burada mutlithreading rolü geliyor. Bu gibi durumlarda, ağ üzerinden yalnızca e-posta ve SMS göndermekten sorumlu, çok iş parçacıklı bir uygulama geliştirmeniz önerilir.


bu cevap neden reddedildi?
Anurag Sharma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.