2013-08-16 42 views
6

Yakın tarihli bir “teknik tartışma” da, “tek bir iş parçacığı kullanarak çoklu işitmeyi nasıl gerçekleştiriyorsunuz?” Diye sorulmuştum. Görüşmecinin bunu bir hile sorusu olarak kabul etmediğini onayladıktan sonra, iyi bir şey yapmadığımı itiraf etmeliydim. Tek bir iş parçacığı üzerinde çoklu iş parçacığına nasıl ulaşılabileceğine ve daha da önemlisi, bu soruya biraz çelişki verdiğimi düşündüm. Görüşmecinin “çok noktaya yayın yapan bir delege kullanarak” yanıtı, bana delegeleri ve altta yatan ipliği gerçekten anlamadığını merak etmemi sağladı. Sorunun herhangi bir liyakati olup olmadığını, daha da önemlisi, ilgili cevabın herhangi bir anlam ifade edip etmediğini bilmek isterdim. Teşekkür ederim.Tek bir iş parçacığı kullanarak çoklu iş parçacığını nasıl gerçekleştirirsiniz?

+2

* hile sorusu *, yine de :). –

+2

Evet; Ne hakkında konuştuğunu bilmiyor. Doğru cevap liflerdir. – SLaks

+3

@SLaks Hala multithreading olmadığını söyleyebilirim. – hvd

cevap

4

Koroutinler, kooperatif çoklu iş parçacığının benzetimini yapmak için yapılır (.NET tarafından desteklenmez, async/await modelinin bir koroutin kalıbı olduğu düşünülmedikçe). Eşzamansız programlama, çoklu iş parçacığını simüle eder (en azından kısmen ... Örneğin birden fazla okuma/yazma aynı anda yürütülür) ... Her ikisi de "iş parçacığı" bölümünü gizleyen olası çözümlerdir.

Eşzamansız programlama hakkında ayrıntılı bilgi ... Tek bir iş parçacığı + eşzamansız bir ayrıntıya bağlı olarak, yüzlerce istekte aynı anda yanıt verebilen bir web sunucusunun tamamı oluşturulabilir. Diskten okunan her biri eşzamansız olarak yapılacaktır. Bağlanan istemcilere her yanıt, eşzamansız ve benzer şekilde yapılacaktı.

tamamen asenkron programlama dayalı tek dişli bir web sunucusudur node.js ben idrak ne bir isim, vermek https://stackoverflow.com/a/14797359/613130

için örneğin bkz ... (teknik olmayan engelleme I/O denir) Ne Ben yazdım, ben Green threads denilen uygulamak bazı dilleri olduğunu ekleyeceğim. Yeşil iş parçacıkları, OS zamanlayıcısını kullanmayan işbirlikçi iş parçacıklarıdır. Kodları tek bir iş parçacığıyla yürütülür (en azından kendi bakış açılarından). Görünüşe göre Go, haskell, eski Ruby, Smalltalk'ın çeşitli sürümleri yeşil iş parçacıklarının kullanıldığı/kullanıldığı).

+1

asenkron = = çok iş parçacıklı olarak kullanılır. asıl fark, eşzamansız kod için sadece bir kerede bütün bir "blok" komutunu çalıştırabilmesi ve bir başka bütün blok bittiğinde sadece kodun başka bir bölümüne geçebilmesidir. Çok iş parçacıklı bir ortamda, bir yığının yürütülmesini duraklatabilir, başka bir bağlamla değiştirebilir ve sonra önceki içeriğe geri dönebilir. C# nin bunu nasıl başarabileceğini göremiyorum; iş parçacığı yardımı olmadan bunu başarmak için bir seviye çok yüksek. – Servy

+1

@Servy Demek istediğim, dış gözlemci perspektiften, eşzamansız == multithreaded: Node.js tarafından aynı anda birden fazla istek işlenebilir. Ve gerçekte asenkron olarak çoklu iş parçacığına benzer, çünkü işlemi iş parçacıklarından birinde çalıştıracak olan işletim sistemine bırakıyorsunuz.Bu yüzden, süreci "içine" yerleştirmek yerine, "süreç ve işletim sistemi boyunca" çok iş parçacıklısı oluyor. Evet, 4'te atasöz elyafını bölüyor, ama soru en azından biraz yanal düşünme gerektiren yarı-hileli bir soruydu. – xanatos

+1

Ama gerçek şu ki, bu çoklulaştırma değil. Bu, soruyu soran kişinin "asenkron" anlamına geldiği ve "çoklu okuma" anlamına gelmediği anlamına gelebilir. Eğer yaptılarsa, bu bir cevap olurdu. – Servy

İlgili konular