A więc odpowiadając na pierwsze i drugie pytanie:
Nieblokowanie jest w rzeczywistości tym samym, co asynchroniczne - wykonujesz wywołanie, a później otrzymasz wynik, ale gdy to się dzieje, możesz zrobić coś innego. Blokowanie jest odwrotne. Przed kontynuowaniem podróży czekasz, aż telefon powróci.
Teraz kod asynchroniczny / nieblokujący brzmi absolutnie fantastycznie i tak jest. Ale mam słowa ostrzeżenia. Async / Non-blocking są świetne podczas pracy w ograniczonych środowiskach, takich jak telefon komórkowy ... rozważ ograniczony procesor / pamięć. Jest to również dobre dla programowania front-end, w którym kod musi w jakiś sposób reagować na widżet interfejsu użytkownika.
Asynchronizacja ma fundamentalne znaczenie dla tego, jak wszystkie systemy operacyjne muszą działać - robią za ciebie gówno w tle i budzą twój kod, gdy zrobią to, o co prosiłeś, a kiedy to połączenie się nie powiedzie, powiedziano ci, że tak się nie stało działają albo przez wyjątek, albo przez jakiś rodzaj kodu powrotu / obiektu błędu.
W momencie, gdy kod prosi o coś, co zajmie trochę czasu, aby odpowiedzieć, Twój system operacyjny wie, że może być zajęty robieniem innych rzeczy. Twój kod - proces, wątek lub odpowiednik, bloki. Twój kod jest całkowicie nieświadomy tego, co jeszcze dzieje się w systemie operacyjnym, gdy czeka na to połączenie sieciowe, lub gdy czeka na odpowiedź z żądania HTTP, lub gdy czeka na odczyt / zapis pliku, i wkrótce. Twój kod mógłby „po prostu” czekać na kliknięcie myszą. To, co faktycznie działo się w tym czasie, to to, że system operacyjny bezproblemowo zarządza, planuje i reaguje na „zdarzenia” - rzeczy, na które system operacyjny zwraca uwagę, takie jak zarządzanie pamięcią, I / O (klawiatura, mysz, dysk, internet), inne zadania, usuwanie awarii itp.
Systemy operacyjne są cholernie twarde. Są naprawdę dobrzy w ukrywaniu wszystkich skomplikowanych elementów asynchronicznych / nieblokujących przed programistą. I w ten sposób większość programistów dotarła do miejsca, w którym jesteśmy dzisiaj dzięki oprogramowaniu. Teraz zbliżamy się do limitów procesora, ludzie mówią, że można zrobić coś równolegle, aby poprawić wydajność. Oznacza to, że Async / non-blocking wydaje się być bardzo korzystną rzeczą do zrobienia i tak, jeśli twoje oprogramowanie tego wymaga, zgadzam się.
Jeśli piszesz serwer WWW zaplecza, postępuj ostrożnie. Pamiętaj, że możesz znacznie taniej skalować w poziomie. Netflix / Amazon / Google / Facebook są jednak oczywistymi wyjątkami od tej reguły, tylko dlatego, że taniej im wychodzi używanie mniejszej ilości sprzętu.
Powiem ci, dlaczego kod asynchroniczny / nieblokujący to koszmar z systemami zaplecza ...
1) To staje się odmowa usługi w zakresie produktywności ... musisz dużo więcej myśleć i po drodze popełniasz wiele błędów.
2) Ślady stosu w kodzie reaktywnym stają się nieczytelne - trudno powiedzieć, co nazywało się co, kiedy, dlaczego i jak. Powodzenia w debugowaniu.
3) Musisz więcej pomyśleć o tym, jak coś zawodzi, zwłaszcza gdy wiele rzeczy wraca do normy, jak je wysłałeś. W starym świecie robiłeś jedną rzecz na raz.
4) Trudniej jest przetestować.
5) Trudniej jest utrzymać.
6) To bolesne. Programowanie powinno być przyjemne i przyjemne. Tylko masochiści lubią ból. Ludzie, którzy piszą ramy współbieżne / reaktywne, są sadystami.
I tak, napisałem zarówno sync, jak i async. Wolę synchronizację, ponieważ 99,99 aplikacji zaplecza może sobie poradzić z tym paradygmatem. Aplikacje frontonu wymagają reaktywnego kodu, bez pytania, i zawsze tak było.
Tak, kod może być asynchroniczny, nieblokujący ORAZ oparty na zdarzeniach.
Najważniejszą rzeczą w programowaniu jest upewnienie się, że kod działa i reaguje w akceptowalnym czasie. Trzymaj się tej kluczowej zasady i nie możesz się pomylić.