2013-08-16 13 views
6

W niedawnej "technicznej dyskusji" zapytano mnie "w jaki sposób osiągasz wielowątkowość używając jednego wątku?" Po potwierdzeniu, że ankieter nie uznał tego za podchwytliwe pytanie, musiałem przyznać, że nie miałem dobrego pomysł, jak osiągnąć wielowątkowość w jednym wątku, a ponadto, uznałem to pytanie za pewną sprzeczność. Odpowiedź, którą podał ankieter, "za pomocą delegata ds. Multiemisji" sprawiła, że ​​zastanawiałem się, czy on naprawdę nie rozumiał delegatów i podstawowych wątków. Byłbym zainteresowany, aby wiedzieć, czy pytanie ma jakieś zalety i, co ważniejsze, jeśli skojarzona odpowiedź ma jakiś sens. Dziękuję Ci.w jaki sposób osiągnąć wielowątkowość za pomocą jednego wątku?

+2

* Podchwytliwe pytanie *, chociaż :). –

+2

Tak; nie ma pojęcia o czym mówi. Poprawną odpowiedzią są włókna. – SLaks

+3

@SLaks Powiedziałbym, że nadal nie jest wielowątkowość. – hvd

Odpowiedz

4

Coroutines są czymś, co można zrobić, aby zasymulować współpracę wielowątkowości (nieobsługiwany przez .NET, chyba że weźmiemy pod uwagę, że wzorzec async/await ma charakter coroutine).

Programowanie asynchroniczne symuluje wielowątkowość (przynajmniej częściowo ... Wykonano więcej niż jeden odczyt/zapis na przykład w tym samym czasie) ... Oba są możliwymi rozwiązaniami, które ukrywają część "gwintowania".

Aby opracować programowanie asynchroniczne ... Można zbudować cały serwer WWW, który będzie w stanie odpowiadać na setkę żądań w tym samym czasie, na podstawie pojedynczego wątku + asynchronicznego opracowania. Każdy odczyt z dysku zostanie wykonany asynchronicznie. Każda odpowiedź na łączących się klientów byłaby wykonywana asynchronicznie i tak dalej.

Aby nadać nazwę, z tego co mi pojąć, node.js jest pojedynczym gwintowane serwer WWW całości opiera się na programowaniu asynchronicznym (technicznie nazywa zakaz blokowania I/O), ... zobacz np https://stackoverflow.com/a/14797359/613130

Do czego Napisałem, dodam, że są pewne języki, które implementują to, co nazywa się Green threads. Zielone wątki są wątkami współpracy, które nie korzystają z programu planującego systemu operacyjnego. Ich kod jest więc wykonywany w jednym wątku (przynajmniej z ich punktu widzenia). Wygląda na to, że Go, haskell, stara Ruby, różne wersje Smalltalk używają/używają zielonych wątków).

+1

asynchroniczne! = Wielowątkowe. główna różnica polega na tym, że kod asynchroniczny może uruchomić cały "blok" kodu, wszystko na raz, i może zamienić się tylko na inną sekcję kodu, gdy kończy się inny blok. W środowisku wielowątkowym może wstrzymać wykonywanie stosu, zamienić go na inny kontekst, a następnie wrócić do poprzedniego kontekstu. Nie widzę, jak C# byłby w stanie to osiągnąć; jest zbyt wysoki, aby go wykonać bez pomocy wątków. – Servy

+1

@Servy Co mam na myśli to, że z perspektywy zewnętrznego obserwatora, asynchroniczne == wielowątkowe: więcej niż jedno żądanie może być przetwarzane przez Node.js w tym samym czasie. A tak na prawdę asynchroniczny jest podobny do wielowątkowego, ponieważ pozostawiasz operację w systemie operacyjnym, który wykona ją na jednym z wątków.Zamiast wielowątkowości "wewnątrz" procesu, jest wielowątkowy "w całym procesie i systemie operacyjnym". Tak, dzieli się przysłowiowe włókno na 4, ale pytanie było pół-podstępne, wymagające przynajmniej odrobiny myślenia lateralnego. – xanatos

+1

Jednak faktem jest, że nie jest to wielowątkowość. Może to oznaczać, że osoba zadająca pytanie w rzeczywistości oznacza "asynchroniczny", a nie "wielowątkowy". Gdyby tak było, byłaby to odpowiedź. – Servy

Powiązane problemy