Czy wywołanie asynchroniczne zawsze tworzy nowy wątek? Jaka jest różnica między nimi?
Czy wywołanie asynchroniczne zawsze tworzy lub używa nowego wątku?
W programowaniu komputerowym zdarzenia asynchroniczne to takie, które występują niezależnie od głównego przepływu programu. Akcje asynchroniczne to akcje wykonywane w schemacie nieblokującym, które pozwalają głównemu przepływowi programu kontynuować przetwarzanie.
Wiem, że połączenia asynchroniczne można wykonywać na pojedynczych wątkach? Jak to jest możliwe?
multithreading
language-agnostic
asynchronous
Ted Smith
źródło
źródło
Odpowiedzi:
To pytanie jest cholernie zbyt ogólne, aby odpowiedzieć.
W ogólnym przypadku wywołanie asynchroniczne niekoniecznie tworzy nowy wątek. To jeden ze sposobów implementacji, z istniejącą wcześniej pulą wątków lub procesem zewnętrznym. Zależy to w dużym stopniu od języka, modelu obiektowego (jeśli istnieje) i środowiska wykonawczego.
Asynchroniczny oznacza po prostu, że wątek wywołujący nie siedzi i nie czeka na odpowiedź, ani działanie asynchroniczne nie występuje w wątku wywołującym.
Poza tym będziesz musiał uzyskać bardziej szczegółowe informacje.
źródło
Zawsze, gdy operacja, która musi być wykonywana asynchronicznie, nie wymaga pracy procesora, można ją wykonać bez tworzenia kolejnego wątku. Na przykład, jeśli operacja asynchroniczna to I / O, CPU nie musi czekać na zakończenie I / O. Wystarczy rozpocząć operację, a następnie może przejść do innej pracy, podczas gdy sprzęt we / wy (kontroler dysku, interfejs sieciowy itp.) Działa we / wy. Sprzęt informuje procesor o zakończeniu, przerywając działanie procesora, a system operacyjny dostarcza zdarzenie do aplikacji.
Często abstrakcje wyższego poziomu i interfejsy API nie uwidaczniają bazowe asynchroniczne interfejsy API dostępne w systemie operacyjnym i podstawowym sprzęcie. W takich przypadkach zwykle łatwiej jest tworzyć wątki do wykonywania operacji asynchronicznych, nawet jeśli spawnowany wątek tylko czeka na operację we / wy.
Jeśli operacja asynchroniczna wymaga działania procesora, to generalnie operacja ta musi odbywać się w innym wątku, aby była naprawdę asynchroniczna. Nawet wtedy będzie to naprawdę asynchroniczne tylko wtedy, gdy będzie więcej niż jedna jednostka wykonawcza.
źródło
Nie, wywołania asynchroniczne nie zawsze obejmują wątki.
Zazwyczaj rozpoczynają jakąś operację, która jest kontynuowana równolegle z rozmówcą. Ale ta operacja może być obsługiwana przez inny proces, przez system operacyjny, przez inny sprzęt (np. Kontroler dysku), przez inny komputer w sieci lub przez człowieka. Wątki nie są jedynym sposobem na równoległe wykonywanie zadań.
źródło
JavaScript jest jednowątkowy i asynchroniczny. Na przykład, gdy używasz XmlHttpRequest, udostępniasz mu funkcję wywołania zwrotnego, która zostanie wykonana asynchronicznie po zwróceniu odpowiedzi.
John Resig dobrze wyjaśnia powiązany problem z działaniem liczników czasu w JavaScript .
źródło
Wielowątkowość odnosi się do więcej niż jednej operacji wykonywanej w tym samym procesie. Podczas gdy programowanie asynchroniczne rozprzestrzenia się między procesami. Na przykład, jeśli moje operacje wywołują usługę internetową, wątek nie musi czekać na powrót usługi sieciowej. Tutaj używamy programowania asynchronicznego, które pozwala wątkowi nie czekać na zakończenie procesu na innej maszynie. A kiedy zacznie otrzymywać odpowiedź z usługi sieciowej, może przerwać główny wątek, aby powiedzieć, że usługa internetowa zakończyła przetwarzanie żądania. Teraz główny wątek może przetworzyć wynik.
źródło
Windows zawsze miał przetwarzanie asynchroniczne od czasów nie wywłaszczających (wersje 2.13, 3.0, 3.1 itd.) Przy użyciu pętli komunikatów, na długo przed obsługą rzeczywistych wątków. Aby odpowiedzieć na twoje pytanie, nie, nie jest konieczne tworzenie wątku do wykonywania asynchronicznego przetwarzania.
źródło
Asynchroniczne wywołania nie muszą nawet występować w tym samym systemie / urządzeniu, co wywoływane. Jeśli więc pytanie brzmi, czy wywołanie asynchroniczne wymaga wątku w bieżącym procesie, odpowiedź brzmi: nie. Jednak musi istnieć wątek wykonywania gdzieś przetwarzający żądanie asynchroniczne.
Wątek wykonania to niejasny termin. We współpracujących systemach zadań, takich jak wczesne Macintosh i Windows OS, wątek wykonania może być po prostu tym samym procesem, który spowodował, że żądanie uruchomiło inny stos, wskaźnik instrukcji itp. Jednak gdy ludzie ogólnie mówią o wywołaniach asynchronicznych , zazwyczaj oznaczają wywołania, które są obsługiwane przez inny wątek, jeśli jest to proces wewnątrzprocesowy (tj. w ramach tego samego procesu) lub przez inny proces, jeśli jest to proces międzyprocesowy.
Należy zauważyć, że komunikacja międzyprocesowa (lub międzyprocesowa) (IPC) jest powszechnie uogólniana w celu uwzględnienia komunikacji wewnątrzprocesowej, ponieważ techniki blokowania i synchronizacji danych są zwykle takie same, niezależnie od tego, w jakim procesie działają oddzielne wątki wykonania.
źródło
Niektóre systemy pozwalają na wykorzystanie współbieżności jądra dla niektórych funkcji przy użyciu wywołań zwrotnych. W raczej mało znanym przypadku asynchroniczne wywołania zwrotne we / wy zostały użyte do zaimplementowania nieblokujących serwerów internetowych w czasach wielozadaniowości bez wywłaszczania w systemie Mac System 6-8.
W ten sposób masz współbieżne strumienie wykonywania „w” programie bez wątków jako takich .
źródło
Asynchroniczny oznacza po prostu, że nie blokujesz programu czekającego na zakończenie (wywołanie funkcji, urządzenie itp.). Można go zaimplementować w osobnym wątku, ale często używa się dedykowanego wątku do zadań synchronicznych i komunikuje się za pośrednictwem pewnego rodzaju systemu zdarzeń, uzyskując w ten sposób zachowanie podobne do asynchronicznego.
Istnieją przykłady jednowątkowych programów asynchronicznych. Coś jak:
źródło
Charakter połączeń asynchronicznych jest taka, że jeśli chcesz, aby aplikacja nadal działa, gdy rozmowa jest w toku, to albo trzeba tarło nowy wątek, a przynajmniej wykorzystać inny wątek, że zostały stworzone wyłącznie dla celów obsługa asynchronicznych wywołań zwrotnych.
Czasami, w zależności od sytuacji, możesz chcieć wywołać metodę asynchroniczną, ale sprawić, by wyglądała ona na użytkownika jako synchroniczna (tj. Blokuj, dopóki metoda asynchroniczna nie zasygnalizuje, że została zakończona). Można to osiągnąć za pomocą interfejsów API Win32, takich jak WaitForSingleObject .
źródło