SORU
18 Ocak 2012, ÇARŞAMBA


Engellenmeyen, tek dişli, zaman uyumsuz bir web sunucusu (node.js gibi) mümkündür .NET?

this question, arayan bir oluşturmak için bir yer arıyordumtek iş parçacıklıtabanlı zaman uyumsuz olay web server yapmayan .NET.

This answer kod tek bir iş parçacığı çalışır iddia ederek ilk başta umut verici görünüyordu.

Ancak, C Bu test#:

using System;
using System.IO;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

        var sc = new SynchronizationContext();
        SynchronizationContext.SetSynchronizationContext(sc);
        {
            var path = Environment.ExpandEnvironmentVariables(
                @"%SystemRoot%\Notepad.exe");
            var fs = new FileStream(path, FileMode.Open,
                FileAccess.Read, FileShare.ReadWrite, 1024 * 4, true);
            var bytes = new byte[1024];
            fs.BeginRead(bytes, 0, bytes.Length, ar =>
            {
                sc.Post(dummy =>
                {
                    var res = fs.EndRead(ar);

                    // Are we in the same thread?
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                }, null);
            }, null);
        }
        Thread.Sleep(100);
    }
}

Ve sonuç şuydu:

1
5

Gibi, cevabı tersine, iplik okumak ve iş parçacığı başlatılıyor okuma sona eriyor gibi görünüyordeğilaynı.

Şimdi benim sorum, nasıl bir fark etmektek iş parçacıklıtabanlı zaman uyumsuz olay web server yapmayan .NET?

CEVAP
18 Ocak 2012, ÇARŞAMBA


SetSynchronizationContext bütün kırmızı ringa olduğunu, bu sadece sıralama için bir mekanizmadır, bu iş hala IO iş Parçacığı Havuzu olur.

Ne bir şekilde sıraya ve ana iş parçacığı tüm IO çalışmanız için Asynchronous Procedure Calls hasat edilir. Birçok üst düzey sarın bu tür işlevsellik çerçeveler, libevent en ünlüsü.

Çeşitli seçenekler burada büyük bir özetleyelim: Whats the difference between epoll, poll, threadpool?.

.NET zaten "IO" IO BeginXYZ yöntemlerini çağırdığınızda. erişim işleyen iş Parçacığı Havuzu, bir özel tarafından sizin için Ölçekleme ilgilenir Bu IO iş Parçacığı Havuzu kutusunda işlemci başına en az 1 iş parçacığı olması gerekir. bakın: ThreadPool.SetMaxThreads.

Eğer tek dişli uygulaması kritik bir gereklilik (nedenini) ise, tabii ki, DllImport (example here) kullanarak bu şeyleri birlikte çalışma olabilir

Ancak complex and risky task bir çok olur

Neden tamamlama mekanizması olarak Zpt destek değil mi? Zpt gerçekten kullanıcı kodu için genel amaçlı tamamlama mekanizması iyi değil. Yeniden kullanılabilirlik T tarafından sunulan yönetmek neredeyse imkansızdır; kilit, örneğin, bazı rasgele G/Ç tamamlanma engellemek her zaman konu ele geçirebilir. Kilit sipariş sorun çıkarabilir ki kendi kilitleri, elde etmek için denemek ve böylece çıkmaz. Bu titiz tasarımı ve başkasının kodunu asla duyurulabilir sırasında çalışacak emin olmak için yetenek gerektirir önlenmesi bekle, ve tersi. Bu büyük ölçüde Zpt yararlılığını sınırlar.

Yani, özetlemek gerekirse. Eğer istersenizdişli tekişini yapar, tüm bu süreç APC ve tamamlanma noktalarını kullanarak yönetilen, el koduna sahip olacak. Bu bina riskli ve zor olacaktır.

Sadece istiyorsanızyüksek ölçekliağ, BeginXYZ ve aile kullanıyoruz ve APC kullandığından beri iyi performans olacaktır emin olabilirsiniz. İş parçacıkları arasında küçük bir fiyat şeyler sıralanırken ödeme yaparsınız .NET özel uygulama.

Kimden: http://msdn.microsoft.com/en-us/magazine/cc300760.aspx

Sunucu/Ç/zaman Uyumsuz g zaman uyumsuz G / Ç kullanmak için yukarı Ölçekleme sonraki adım ve bir iş parçacığı oluşturmak ve yönetmek için ihtiyacı azaltır. Bu çok daha basit bir kod yol açar ve aynı zamanda daha verimli I/O modeli. Zaman uyumsuz G/Ç kullanan aramalar için başa gelen veri ve bağlantıları, anlamı yok listelerine kurmak ve tarama ve ihtiyac yoktur. oluşturmak yeni iş parçacıkları için anlaşma ile bekleyen G/Ç

Windows dişli tamamlama bağlantı noktalarını kullanarak zaman uyumsuz yuva yapmak için hızlı bir yol değil, tek görmek ilginç tarafı bir gerçek: http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/info/comport.shtml

Bir server hedefi, iş parçacığı, aynı anda birden çok iş parçacığı kullanarak paralellik maksimize ederken gereksiz engelleme, önlemek suretiyle mümkün olduğunca az bağlam anahtarları olarak tabi. İdeal bir iş parçacığı aktif olarak her bir işlemci üzerinde bir istemci isteğine hizmet olması ve bu iş parçacığı eğer ek istekleri isteği tamamlandığında bekleyen varsa orada engellemek için değil. Bunun doğru çalışması için ancak, bir yolu olmalı için uygulamayı etkinleştirmek için başka bir iş parçacığı bir işlem bir istemci isteği blok I/O (gibi okur bir dosya bir parçası olarak işleme).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Pepsi

    Pepsi

    1 Kasım 2005
  • TheGamer2323

    TheGamer2323

    25 Ocak 2009
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006