Thread vs ThreadPool


137

Yeni bir iş parçacığı kullanmak ve iş parçacığı havuzundan bir iş parçacığı kullanmak arasındaki fark nedir? Hangi performans avantajları vardır ve neden açıkça oluşturduğumdan ziyade havuzdan bir iş parçacığı kullanmayı düşünmeliyim? Burada özellikle .NET düşünüyorum, ama genel örnekler iyi.

Yanıtlar:


110

İş parçacığı havuzu, sık ve nispeten kısa operasyonlar için

  • Yenilerini oluşturmak yerine zaten oluşturulmuş olan konuları yeniden kullanmak (pahalı bir süreç)
  • Yeni iş öğeleri için istek patlaması olduğunda iş parçacığı oluşturma oranını azaltma (bunun yalnızca .NET 3.5'te olduğuna inanıyorum)

    • 100 iş parçacığı havuzu görevlerini sıralarsanız, yalnızca bu isteklere hizmet vermek için önceden oluşturulmuş sayıda iş parçacığı kullanılır (örneğin 10 diyelim). Iş parçacığı havuzu sık kontroller (3.5 SP1 her 500ms inanıyorum) yapacak ve kuyruk görevleri varsa, yeni bir iş parçacığı yapacak. Görevleriniz hızlıysa, yeni iş parçacıklarının sayısı az olacaktır ve kısa görevler için 10 kadar iş parçacığını tekrar kullanmak 100 iş parçacığı oluşturmaktan daha hızlı olacaktır.

    • İş yükünüz sürekli olarak çok sayıda iş parçacığı havuzu isteği içeriyorsa, iş parçacığı havuzu, yukarıdaki işlemle havuzda daha fazla iş parçacığı oluşturarak kendi iş yükünüze ayarlayacaktır, böylece istekleri işlemek için çok sayıda iş parçacığı bulunur

    • kontrol İşte başlık altında nasıl iş parçacığı havuzu fonksiyonları üzerindeki daha ayrıntılı bilgiler daha

İş nispeten uzun sürecekse (muhtemelen bir veya iki saniye civarında olsa da, yeni bir iş parçacığı oluşturmak kendiniz daha uygun olacaktır, ancak bu duruma bağlıdır)

@Krzysztof - İş Parçacığı Havuzu iş parçacıkları, ana iş parçacığı sona erdiğinde duracak arka plan iş parçacıklarıdır. Manuel olarak oluşturulan iş parçacıkları varsayılan olarak ön plandadır (ana iş parçacığı bittikten sonra çalışmaya devam eder), ancak bunlarda Başlat'ı çağırmadan önce arka plana ayarlanabilir.


5
Merak ettiğim tek şey MSDN'den aşağıdaki ifadedir ( msdn.microsoft.com/tr-tr/library/1c9txz50.aspx ) . ". Yani bu, çekirdekler arasında çalışmayı bölerken ön plandaki ipliklerin öncelikli olduğu anlamına mı geliyor?
cdiggins

1
➤ İş parçacığı havuzundan bir iş parçacığını iptal edemez veya kesemezsiniz. ➤ İş parçacığı havuzundan bir iş parçacığına katılamazsınız. Bunu başarmak için başka mekanizmalar kullanmalısınız
Zinov

14

.NET yönetilen threadpool: -

  • Mevcut iş yüküne ve mevcut donanıma göre kendini boyutlandırır
  • Çalışan iş parçacığı ve tamamlama bağlantı noktası iş parçacığı (özellikle ES'ye hizmet etmek için kullanılır) içerir
  • Çok sayıda nispeten kısa ömürlü operasyon için optimize edilmiştir

Uzun süren işlemler için daha uygun olabilecek diğer iş parçacığı havuzu uygulamaları vardır.

Özellikle, uygulamanızın çok fazla iş parçacığı oluşturmasını önlemek için bir iş parçacığı havuzu kullanın . Bir iş parçacığının en önemli özelliği çalışma kuyruğudur. Yani, makineniz yeterince meşgul olduğunda, iş parçacığı derhal daha fazla iş parçacığı oluşturmak yerine istekleri sıraya koyacaktır.

Yani, küçük, sınırlı sayıda iş parçacığı oluşturursanız, bunları kendiniz oluşturun. Kaç tane iş parçacığının oluşturulabileceğini önceden belirleyemiyorsanız (örn. Gelen G / Ç'ye yanıt olarak oluşturulmuşlar) ve çalışmaları kısa ömürlü olacaksa, iş parçacığı havuzunu kullanın. Kaç tane olduğunu bilmiyorsanız, ancak çalışmaları uzun sürecekse, platformda size yardımcı olacak hiçbir şey yoktur - ancak uygun alternatif threadpool uygulamaları bulabilirsiniz.


.NET'te, tamamlama bağlantı noktalarını iş parçacığı havuzu olmadan kullanabilirsiniz? Async I / O yöntemlerinin (.NET'te) tek yol olduğu ve iş parçacığı havuzunu kullandıkları varsayımı altındaydım
Karg

10

Ayrıca

new Thread().Start()

Programınızı kapatırsanız ölmeyecek olan Önalan iplik işlenir. ThreadPool iş parçacıkları, uygulamayı kapattığınızda ölen arka plan iş parçacıklarıdır.


11
Her zaman arka plan için bir iş parçacığı ayarlayabilirsiniz. Varsayılan olarak sadece ön plandadırlar.
Kris Erickson

3
nemo: var t = yeni Konu (...); t.BackgroundThread = true; t.Start ();
Ricardo Amores

18
"Program" terimi ile ilgili açıklama. Bir masaüstü uygulaması bir işlemde çalışır ve kullanıcı arayüzünü yöneten en az bir ön plan iş parçacığına sahiptir. Bu işlem, ön plan iş parçacığı olduğu sürece çalışmaya devam edecektir. Bir masaüstü uygulamasını kapattığınızda, ön plan UI iş parçacığı durur, ancak başka ön plan iş parçacığı varsa işlemi durdurmanız gerekmez .
G-Wiz

8

Bunlar için göreceli kaynak kullanımı hakkında meraklıydım ve 2012 çift çekirdekli Intel i5 dizüstü bilgisayarda Windows 8'de .net 4.0 sürüm derlemesi kullanarak bir karşılaştırma ölçütü çalıştırdım. Hanım. Diğer bir deyişle, havuzdaki iplik çok sayıda kısa ömürlü iplik için yaklaşık 300 kat daha hızlı başladı. En azından test edilen aralıkta (100-2000) ipliklerde, iplik başına toplam süre oldukça sabit görünüyordu.

Kıyaslanan kod şudur:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

resim açıklamasını buraya girin


5
Ben ThreadPool yerine yenilerini oluşturmak için oluşturulan konuları yeniden kullanmak düşünüyorum (çok pahalı)
fabriciorissetto


1

İş parçacığı yerel depolama, iş parçacığı havuzları için iyi bir fikir değildir. Konulara bir "kimlik" verir; artık tüm evreler eşit değil. Şimdi iş parçacığı havuzları, özellikle iş yükü yaratmadan işinizi yapmaya hazır bir grup özdeş iş parçacığına ihtiyacınız varsa özellikle yararlıdır.


1

Çok sayıda iş parçacığına ihtiyacınız varsa, muhtemelen bir ThreadPool kullanmak istersiniz. Onlar iplik kullanım yükü size tasarruf iplik kullanımı yeniden.

Bir şey yapmak için sadece bir iş parçacığına ihtiyacınız varsa, iş parçacığı muhtemelen en kolay olanıdır.


1

Theadpool dişlerinin birincil ihtiyacı, neredeyse anında tamamlanması beklenen kısa küçük görevleri yerine getirmektir. Donanım kesme işleyicileri genellikle çekirdek olmayan kod için uygun olmayan bir yığınlama bağlamında çalışır, ancak bir donanım kesme işleyicisi bir kullanıcı modu G / Ç tamamlama geri aramasının mümkün olan en kısa sürede çalıştırılması gerektiğini keşfedebilir. Böyle bir şeyi yürütmek için yeni bir iş parçacığı oluşturmak büyük bir aşırıya kaçma olacaktır. G / Ç tamamlama geri çağrılarını veya diğer benzer şeyleri çalıştırmak için gönderilebilen önceden oluşturulmuş birkaç iş parçacığına sahip olmak çok daha verimlidir.

Bu tür iş parçacıklarının önemli bir yönü, G / Ç tamamlama yöntemleri her zaman esasen anında tamamlanır ve hiçbir zaman engellenmezse ve şu anda bu tür yöntemleri çalıştıran bu iş parçacıklarının sayısının en az işlemci sayısına eşit olması, diğer iş parçacıklarının tek yoludur. yukarıda bahsedilen yöntemlerden biri bitmeden önce, diğer yöntemlerden birinin bloke olması veya yürütme süresinin normal bir diş açma zaman dilimini aşması durumunda çalışabilir; iş parçacığı havuzu istendiği gibi kullanılırsa bunların hiçbiri çok sık olmamalıdır.

Bir yöntemin yürütülmeye başladığı zaman 100 ms içinde çıkması beklenemezse, yöntemin ana iş parçacığı havuzu dışındaki bazı yollarla yürütülmesi gerekir. Biri CPU yoğun olan ancak engellenmeyen çok sayıda göreve sahipse, bunları kullandığından beri "ana" threadpool'dan ayrı olan bir uygulama iş parçacığı havuzu (CPU çekirdeği başına bir tane) kullanarak göndermek yararlı olabilir. tıkanmayan CPU yoğun görevleri yürütürken çekirdeklerden daha fazla iş parçacığı üretken olmayacaktır. Bununla birlikte, bir yöntemin yürütülmesi bir saniye veya daha uzun sürecek ve zamanının çoğunu bloke edecekse, yöntem muhtemelen özel bir iş parçacığında çalıştırılmalı ve neredeyse kesinlikle bir ana iş parçacığı iş parçacığında çalıştırılmamalıdır. Uzun süren bir işlemin bir G / Ç geri çağırma gibi bir şeyle tetiklenmesi gerekiyorsa,


0

Genel (hiç .NET kullanmadım), bir iş parçacığı havuzu kaynak yönetimi amacıyla kullanılır. Yazılımınızda kısıtlamaların yapılandırılmasını sağlar. Yeni iş parçacıklarının oluşturulması maliyetli olabileceğinden, performans nedenleriyle de yapılabilir.

Sisteme özgü nedenler de olabilir. Java'da (yine bu .NET için geçerli olup olmadığını bilmiyorum), iş parçacığı havuzdan çekilir gibi iş parçacığı yöneticisi iş parçacığı belirli değişkenler uygulayabilir ve döndürüldüğünde onları unset (gibi bir şey geçirmek için ortak yolu) bir kimlik).

Örnek kısıtlama: Ben sadece 10 db bağlantıları var, bu yüzden sadece 10 işçi iş parçacığı veritabanına erişmesine izin verir.

Bu, kendi iş parçacıklarınızı oluşturmamanız gerektiği anlamına gelmez, ancak bir havuz kullanmanın mantıklı olduğu koşullar vardır.


0

Kaç tane iş parçacığının oluşturulacağını bilmiyorsanız veya kontrol edemiyorsanız, havuz kullanmak iyi bir fikirdir.

Sadece bir liste denetimi bir konum değişikliği olayı veritabanından bazı alan güncelleştirmek için iş parçacığı kullanarak bir form sorun var (donma önlemek). Liste konumunu çok hızlı değiştirdiği için, kullanıcının veritabanından bir hata alması (Access ile çok fazla bağlantı) 5 dakika sürdü ...

Temel sorunu (erişim kullanarak değil dahil) çözmek için başka bir yol olduğunu biliyorum ama havuz iyi bir başlangıç.


0

Konu :

  1. Bir iş parçacığı oluşturmak iş parçacığı havuzu kullanmaktan çok daha yavaştır.
  2. Bir iş parçacığının önceliğini değiştirebilirsiniz.
  3. Bir süreçteki kaynaklarla ilgili maksimum iş parçacığı sayısı.
  4. İş parçacığı işletim sistemi düzeyinde ve işletim sistemi tarafından kontrol edilir.
  5. Görev nispeten uzun sürüyorsa İş parçacığı kullanmak daha iyi bir seçenektir

İplik Havuzu :

  1. Bir iş parçacığı iş parçacığı havuzunda çalıştırmak, doğrudan bir iş parçacığı oluşturmaktan çok daha hızlıdır.
  2. İş parçacığı havuzuna göre iş parçacığı çalıştırmasının önceliğini değiştiremezsiniz.
  3. İşlem başına yalnızca bir iş parçacığı havuzu vardır.
  4. İş parçacığı havuzu CLR tarafından yönetilir.
  5. İş Parçacığı havuzu kısa ömürlü kullanım için kullanışlıdır.
  6. İş parçacığı havuzundaki İş Parçacığı sayısı uygulama yüküyle ilişkilidir.
  7. TPL görevleri İş Parçacığı havuzuna göre çalışır
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.