Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 6958|Odpowiedź: 1

Wielowątkowość wprowadza skalowalność w ślepy zaułek

[Skopiuj link]
Opublikowano 06.12.2014 22:21:58 | | |
To artykuł ze świata Pythona, ale nadal jest przydatny w całej dziedzinie programowania, chociaż wielowątkowość pozwala szybciej przetwarzać żądania, ale istnieje też sufit – zielone (mikrowątki) wątki są rozwiązaniem.

Tworzenie oprogramowania wielowątkowego rozwiązuje wiele problemów, zwłaszcza w aplikacjach sieciocentrycznych, które wymagają wymagającej wydajności, by szybko reagować na użytkowników. Niestety, wielowątkowość nie wystarcza do rozwiązania problemów na dużą skalęWspółbieżnośćProblemy seksualne.

Rozwiązanie tych problemów wymaga zmiany modeli programowania, wykorzystując zdarzenia asynchroniczne i mechanizmy oparte na odwołaniach. W Druva stworzyliśmy bibliotekę opartą na Pythonie o nazwie Dhaga, aby rozwiązywać problemy na dużą skalęWspółbieżność, podczas gdy model programowania nie wymaga znaczących zmian.

Programiści mieszkają w jednymWspółbieżnośćświat. Wątki są dziś obywatelami pierwszej klasy, zwłaszcza podczas rozwoju, zwłaszcza gdy Twoja aplikacja wykonuje intensywne operacje sieciowe, jak system inSync (produkt do synchronizacji bezpieczeństwa sieciowego) na przykład Druva. Wielowątkowość ułatwia i ułatwia przepływ kodu programistycznego do operacji sieciowych. Gdy nasza aplikacja potrzebuje poprawy wydajności lub poprawy, można ją ulepszyćElastyczność, możemy zwiększyć liczbę wątków.

Ale jeśli chodzi o tysiące skalWspółbieżnośćProśby, wątki to za mało.

Stwierdziliśmy, że wielowątkowość ma następujące wady:
1. Klient systemowy inSync musi wykonać dużą liczbę plików na serwerze za pomocą wywołań RPC w sieci. Typowym sposobem dla deweloperów na przyspieszenie pracy jest użycie wątków. Jednak wydajność wielowątkowości zwiększa koszty pamięci i procesora; Deweloperzy muszą zachować równowagę między szybkością a liczbą wątków.

2. Nasze serwery muszą obsługiwać system inSync z tysiącami klientówWspółbieżnośćPołączenia i powiadomienia. Aby efektywnie obsługiwać połączenia, używamy wątków do obsługi żądań. Jednak rosnąca liczba klientów systemu inSync oznacza też, że musimy nadal zwiększać liczbę wątków, co zużywa dużo pamięci serwera i procesora.

3. Nasz serwer WWW musi obsługiwać tysiące równoległych żądań HTTP. Większość pracy odbywa się na gniazdach sieciowych, które odbierają i wysyłają dane oraz przekazują je do zaplecza systemu inSync. Powoduje to, że większość wątków czeka na operacje sieciowe. Problem C10K powoduje to, że gdy do serwera WWW trafiają tysiące synchronicznych żądań, generowanie wątku dla każdego żądania jest dość nieskalowalne (skalowanie).

Ograniczenia frameworków asynchronicznych
Wiele frameworków asynchronicznych, w tym Twisted, Tornado Tornado i asyncore, może pomóc deweloperom odejść od popularnych metod używania wątków. Te frameworki opierają się na gniazdach nieblokujących i mechanizmach callback (podobnych do Node.js). Jeśli użyjemy tych frameworków w obecnej formie, główne części naszego kodu Druva będą musiały zostać zrefaktoryzowane. To nie jest to, co chcemy robić. Refaktoryzacja kodu wydłuża cykle rozwoju i testowania, uniemożliwiając spełnienie wymagań skalowania. Ponieważ wiele części produktu musi być masywnych, każdy z nas będzie musiał je refaktoryzować – stąd wysiłek, by podwoić lub potroić.

Aby uniknąć zbyt wielu zmian kodu, musieliśmy odejść od bezpośredniego korzystania z istniejącego frameworka. Na szczęście znaleźliśmy kilka przydatnych narzędzi.

Ponieważ chcemy kontrolować wykonywanie kodu na wejściu i wyjścia sieciowym, potrzebujemy sposobu na podzielenie wątku na mikrowątki. ZnajdujemyGreenlets。 Zapewnia nieimplicitne planowanie mikrowątków zwane korutuną ko-rutyną. Innymi słowy. Jest przydatny, gdy chcesz kontrolować działanie kodu. Możesz budować mikrowątki do niestandardowych harmonogramów, bo możesz kontrolować, kiedy greenlety dają pauzy. To idealne dla nas, ponieważ daje nam pełną kontrolę nad harmonogramem kodu.

Tornado to prosty, nieblokujący framework serwera WWW napisany w Pythonie, zaprojektowany do obsługi tysięcy asynchronicznych żądań. Korzystamy z jego podstawowego komponentu, IOLoop IOStream. IOLoop to nieblokująca pętla zdarzeń I/O w gniazdach; Używa epoll (na Linuksie) lub kolejek (BSD i Mac OS X), w przeciwnym razie wybiera (na Windows), jeśli są dostępne. IOStream oferuje gniazda nieblokujące, takie jak wygodne opakowania do odczytu i zapisu. Delegujemy wszystkie operacje socket Tornado, a następnie używamy callbacków do wyzwalania operacji kodowych do ukończenia (uwaga banq: bardzo podobne do Node.js mechanizmu).

To dobry początek, ale potrzebujemy więcej. Jeśli użyjemy powyższego modułu bezpośrednio w kodzie, wiele elementów naszego kodu RPC będzie musiało się zmienić: planować RPC przez greenlety, upewnić się, że greenlety się nie blokują (jeśli greenlety zostaną zablokowane, zablokuje cały wątek i wszystkie pozostałe), obsługuje funkcje callback z tornado.

Potrzebujemy abstrakcji do zarządzania i organizowania greenletów, aby nie zatykać ich zewnętrznymi wywołaniami, a ta abstrakcja może być znacznie skalowalna poza wątkami. Ta abstrakcja to Dhaga, która pozwala programować przepływ kodu aplikacji jak tradycyjną sekwencję synchroniczną, ale wykonanie jest asynchroniczne.

Dhaga (z hindi, co oznacza wątek) to framework wykonawczy dla lekkiego wątku, który abstrahujemy. Klasa Dhaga wywodzi się z greenlets i wykorzystuje przełączanie stosu do wykonywania wielu przepływów kodu w jednym wątku systemu operacyjnego. Wątki jednego systemu operacyjnego wykonują wiele dhagasów za pomocą planowania współpracy. Za każdym razem, gdy dhaga czeka (głównie na powrót wywołania RPC), przekazuje kontrolę na poziomie nadrzędnym (czyli kontekstowi wykonania wątku na poziomie OS, który ją utworzył). Poziom nadrzędny następnie planuje kolejną dhagę, która ma być gotowa do uruchomienia. Wywołanie RPC zostanie przekazane do serwera WWW tornado, aby zapisał gniazdo asynchronicznie, a następnie zarejestruje callback po jego powrocie, a gdy ten powrót RPC powróci, oczekujący dhaga zostanie dodany do kolejki wykonywalnej i następnie przechwycony przez wątek nadrzędny. (Nota Banq: podobna do node.js zasady)

Możemy używać dhaga zamiast wątków do operacji o wysokim opóźnieniu, a w jednym wątku używamy 512 dhag, gdy liczba wątków przekracza rozsądny limit przepustowości.







Poprzedni:Wzorzec frameworka MVC jest martwy
Następny:Zalety i wady frameworków MVC:
Opublikowano 07.12.2014 17:22:55 |
Czytanie i odpisywanie to cnota
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com