Java 19 Virtual Thread — Kullanmalı mısınız?

Feb 16 2023
Bu blog, Java 19'daki sanal iş parçacıklarının ne olduğunu, sanal iş parçacıklarının uygulama performansını nasıl iyileştirebileceğini ve son olarak sanal iş parçacıklarını kullanarak bazı kıyaslamaları açıklayan 2 bölümlük bir dizinin 1. Kısmıdır. Sanal ileti dizileri nedir : ChatGPT yeni Google olduğu için, "Java19'daki Sanal Konular" tanımını soralım (her seferinde farklı ve anlamlı tanımlar verdi, bu güzelliğin yaratıcılarına saygılar !!!) Java 19'daki hafif iş parçacığı türü.

Bu blog, Java 19'daki sanal iş parçacıklarının ne olduğunu, sanal iş parçacıklarının uygulama performansını nasıl iyileştirebileceğini ve son olarak sanal iş parçacıklarını kullanarak bazı kıyaslamaları açıklayan 2 bölümlük bir dizinin 1. Kısmıdır.

Sanal ileti dizileri nedir:

ChatGPT yeni Google olduğu için “Java19'da Sanal Konular”ın tanımını soralım (her seferinde farklı ve anlamlı tanımlar veriyordu, bu güzelliğin yaratıcılarına selam olsun!!!)

Sanal iş parçacıkları, Java 19'daki bir tür hafif iş parçacıklarıdır. Sanal iş parçacıkları, kullanıcıların geleneksel iş parçacıklarıyla ilişkili ek yük yaşamadan çok sayıda iş parçacığı oluşturmasına olanak tanır. Sanal iş parçacıkları, Java Sanal Makinesi tarafından yönetilir, böylece gerektiğinde yeniden kullanılabilirler ve geleneksel yerel iş parçacıklarıyla karşılaştırıldığında önemli performans iyileştirmeleri sağlarlar.

Dışarıdaki GoLang sevenler için , rutin hale gelen sanal ileti dizileri "Başka Bir Anneden Kardeş" ten başka bir şey değildir.

Sanal ileti dizileri neden yararlıdır?

Java sanal iş parçacıkları , çalıştırmak için sistemden kaç kaynak (RAM) talep ettikleri açısından sanal iş parçacıklarının çok daha hafif olması anlamında orijinal platform iş parçacıklarından farklıdır . Böylece, uygulamalarınızda çalışan platform iş parçacıklarından çok daha fazla sanal iş parçacığına sahip olabilirsiniz. Bu arada, size normal bir platform dizisinin tüm avantajlarını sunar.

Sanal iş parçacıklarının kullanımı

Java'da sanal bir iş parçacığı oluşturmak, geleneksel bir Çalıştırılabilir iş parçacığı oluşturmaya benzer. Ancak, her görev için yeni bir sanal Konu başlatan newVirtualThreadPerTaskExecutor () oluşturmak için Executors sınıfını kullanacağız . Yürütücü tarafından oluşturulan iş parçacığı sayısı sınırsızdır.

Ölçek

Bu testte, harici bir servisi arayacağım (cevap vermesi 1 mili saniye sürer) ve işlemi hem geleneksel platform hem de sanal iş parçacıkları kullanarak 1 milyon kez yapacağım.

Amaç:
İşlemi 1 milyon kez tamamlamak için sanal iş parçacıkları ile geleneksel iş parçacıklarının aldığı süreyi karşılaştırmak.
Makine özellikleri: 10 çekirdek, 16 GB bellek.

kod :

Geleneksel dişler

Artık en fazla 1000 iş parçacığı kullanabiliyordum ve bir OOM hatası alıyordum.

Sanal Konular

Sonuçlar :

Aşağıda, harici for döngüsünü 10 kez çalıştırmak için her iki yaklaşımın da CPU kullanımı + Süresi verilmiştir.

Geleneksel dişler

görmek için yakınlaştır

Sanal iş parçacıkları

görmek için yakınlaştır

Çözüm :

Geleneksel vs sanal iş parçacıklarının s/b kullanımındaki zaman farkı, harici bir hizmet beklememiz durumunda sanal iş parçacıklarını kullanmak için bize net bir avantaj sağlıyor. Bu örneği 10 milyon veya 100 milyon arama olarak tahmin edersek, fark önemli ölçüde artar ve uygulama bazı harici uygulamaları beklerken daha iyi performans gösteren sanal iş parçacıkları ortaya çıkar.

Örnek, harici bir hizmete gerçek bir çağrı ile değiştirilebilen Thread.sleep() kullanılarak harici bir hizmetin çağrılmasını taklit etmiştir . Bu okuyucuya alıştırma olarak bırakılmıştır. YAP!!!

NOT: Deneme yanılma yoluyla, geleneksel iş parçacıklarının oluşturulma sayısını optimize edebileceğimiz doğrudur, ancak her kullanım durumu için mükemmel iş parçacığı sayısını tahmin etmek mümkün olmayacaktır (rastgele daha yüksek iş parçacıklı bir havuz tutarsanız) , uygulama kaynaklarını gereksiz yere harcıyorsunuz). Dinamik bir iş parçacığı tahsisi (sanal iş parçacıkları) kullanmak, gerçek dünya uygulamasında çok daha anlamlıdır.

Sanal Konuları kullanmayla ilgili sorunlar

Yukarıdaki örnek, sanal iş parçacığının çok önemli olduğunu anlamanızı sağladı ve uygulamalarınızı hızlandırmak ve CPU'nuzun en iyi şekilde kullanılması için her zaman sanal iş parçacıkları oluşturmalıyız.

Keşke her şey bir “ AMA ” ile gelmeseydi .

Java'daki sanal iş parçacıkları harikadır, ancak uygulamanız G/Ç'ye bağlı değilse, yani CPU'nun kendisinin bazı ağır işlemler yapması gerekiyorsa (bir modeli eğitmek veya 100 milyona kadar saymak gibi), sanal iş parçacıklarını kullanmak ideal bir seçim değildir.

Bunun detayları bu yazının 2. bölümünde verilecektir. Bizi izlemeye devam edin!!!

Son düşünceler

Java 19'un sistemlere girişi hala geliştirme aşamasındadır (çünkü Loom projesi şimdilik yalnızca önizleme aşamasındadır), ancak sunucu yönetiminde muazzam gelişmeler, daha hızlı API yanıt süreleri ve daha az sıklıkta OOM sorunları görmeyi bekliyoruz.

Yazar hakkında :

Yash Bansal, RedBus'ta Yardımcı Baş Mühendistir. Kendisi hakkında daha fazla bilgiyi LinkedIn profilinde bulabilirsiniz .