SORU
25 AĞUSTOS 2009, Salı


Havuzu Kullanma.Queueuserworkıtem ASP.NET yüksek trafik bir senaryoda

Hep böyleydim altında izlenim kullanarak Havuzu (diyelim ki kritik olmayan) kısa süreli görevler olduğunu kabul en iyi yöntem bile ASP.NET ama sonra ben rastladım this article gibi görünüyor öneririm aksi halde - bağımsız olmak gerekir bırakın Havuzu uğraşmak ASP.NET ilgili istekleri.

Şu ana kadar küçük zaman uyumsuz görevler yapıyorum böyle:

ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))

Ve the article yerine bir iş parçacığı açıkça, benzer oluşturmak için öneriyor:

new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()

İlk yöntem yönetilen ve sınırlı olması avantajı vardır, ama arka plan görevleri sonra ASP.NET istek-işleyicileri ile iş parçacığı için yarışıyor eğer yazı doğru ise () potansiyel var. İkinci yöntem, sınırsız ve böylece potansiyel olarak çok fazla kaynakları kullanarak mal Havuzu, fakat açığa çıkar.

Benim sorum, bu makaledeki tavsiyeler doğru mu?

Eğer bir site çok fazla trafik bu Havuzu başlamıştı tam, o zaman gitmek daha iyi bant veya bir tam Havuzu ima ediyorsun almak için sınırı kaynaklarınızı neyse, bu durumda olmamalısın yeni bir başlangıç yapmak, kendi iş parçacığı?

Açıklama: sadece sordum kapsamında küçük olmayan kritik zaman uyumsuz görevler (örneğin, uzaktan günlüğü), pahalı iş kalemleri gerektirecek ayrı bir işlem (bu durumda katılıyorum ihtiyacınız olacak daha sağlam bir çözüm).

CEVAP
15 NİSAN 2010, PERŞEMBE


Diğer cevaplar burada en önemli nokta bırakmak gibi görünüyor:

Düşük-yük bir sitede daha hızlı halletmek için CPU-yoğun bir işlem parallelize için çalıştığınız sürece, hiç bir iş parçacığı kullanarak nokta yok.

Hem boş iş parçacığı, QueueUserWorkItem isteklerine yanıt ThreadPool new Thread(...) ve işçi iş parçacığı tarafından oluşturulan için de geçerli.

Evet, doğru, o da sensinolabilirçok fazla çalışma öğeleri sıraya ASP.NET bir süreçte ThreadPool açlıktan. Ek istekleri işleme ASP.NET engeller. Bu makaledeki bilgiler, bu açıdan doğru değildir; aynı iş parçacığı havuzu QueueUserWorkItem da istekleri sunmak için kullanılır.

Ama eğer gerçekten yeteri kadar çalışma öğeleri bu açlık neden kuyruk varsa, o zaman sengerekiriş parçacığı havuzu aç! Eğer tam anlamıyla aynı anda CPU-yoğun operasyonlar yüzlerce çalıştırıyorsanız, iyi makine zaten aşırı yüklendiğinde ASP.NET bir isteği sunmak için başka bir iş parçacığı için daha ne yapabilirim? Eğer bu duruma çalıştırıyorsanız, tamamen yeniden dizayn etmek gerekir!

Çoğu zaman görüyorum ya da çok iş parçacıklı kod uygunsuz kuyruk için değil ASP.NET içinde kullanılan İŞLEMCİ-yoğun iş hakkında duymak. I/O-bağlı iş sıralama için. Veeğer/O işi ben yapmak isterseniz, G/Ç iş parçacığı (G/Ç Tamamlama bağlantı Noktası/) kullanıyor olmalıdır.

Özellikle, zaman uyumsuz geri aramaları her ne kullanıyorsunuz tarafından desteklenen kullanıyor olması gerekir. Bu yöntemler her zaman çok açık bir şekilde etiketlenir; kelimeler Begin End ile başlar. *, , *Socket.BeginConnectWebRequest.BeginGetResponse11, ve benzerleri gibi.

Bu yöntemleryapınhangi ** 14, ama IOCPs kullandıkları kullanındeğilASP.NET istekleri ile müdahale. "Up" I/O sistemi. gelen kesme sinyali tarafından uyandırılmak hafif parçacığı özel bir tür onlar Ve ASP.NET bir uygulama, normalde her istek bir zaman uyumsuz işlem sıraya böylece her iş parçacığı için iş parçacığı O, ben/bir tane var. Gerçekten önemli bir performans düşüşü olmadan zaman uyumsuz işlemleri yüzlerce (G/Ç alt sistemi uydurabilecek varsayarak). İhtiyacın olan daha fazlası.

Sadece aklınızda tutun uyumsuzdelegelerbu şekilde çalışmaz - bir iş parçacığı, sadece ThreadPool.QueueUserWorkItem gibi kullanarak olacak. Sadece dahili zaman uyumsuz yöntemleri .Bu yapma yeteneğine sahip olduğunu NET bir Çerçeve kütüphane sınıfları. Bunu kendiniz yapabilirsiniz, ama karmaşık ve bu tartışmanın kapsamı dışındadır biraz tehlikeli ve muhtemelen.

Bu soruya verilecek en iyi cevap, benceThreadPool kullanmayınyaASP.NET Thread örnek bir arka plan. O UI duyarlı tutmak mı Windows Forms uygulaması, bir konu değil gibi dönüyor ve ne kadar etkili olduğu umurumda değil. ASP.NET endişeniziişlem hacmitüm bu alt iş parçacığı üzerinde bağlam geçişi mutlaka vardır , veöldürmekThreadPool kullanıp iş hızını ya da değil.

Lütfen, kendini yazılı iş parçacığı oluşturma kodu ASP.NET - dikkate olsun veya olmasın, olabilir yeniden kullanmak için önceden varolan bir zaman uyumsuz yöntem, ve eğer değil, o zaman lütfen dikkate olsun veya olmasın, gerçekten, gerçekten ihtiyacım var bu kodu çalıştırmak için bir arka plan iş parçacığı. Çoğu durumda, muhtemelen net bir fayda için karmaşıklık ekler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007