Współbieżność w Pythonie - wprowadzenie
W tym rozdziale zrozumiemy pojęcie współbieżności w Pythonie i poznamy różne wątki i procesy.
Co to jest współbieżność?
Krótko mówiąc, współbieżność to występowanie dwóch lub więcej zdarzeń w tym samym czasie. Współbieżność jest zjawiskiem naturalnym, ponieważ wiele zdarzeń zachodzi jednocześnie w danym momencie.
Jeśli chodzi o programowanie, współbieżność występuje, gdy dwa zadania nakładają się na siebie podczas wykonywania. Dzięki programowaniu współbieżnemu wydajność naszych aplikacji i systemów oprogramowania może zostać poprawiona, ponieważ możemy jednocześnie obsługiwać żądania, zamiast czekać na zakończenie poprzedniego.
Historyczny przegląd współbieżności
Poniższe punkty dadzą nam krótki historyczny przegląd współbieżności -
Z koncepcji kolei
Współbieżność jest ściśle związana z koncepcją kolei. W przypadku kolei istniała potrzeba obsługi wielu pociągów w tym samym systemie kolejowym w taki sposób, aby każdy pociąg bezpiecznie dotarł do celu.
Obliczenia współbieżne w środowisku akademickim
Zainteresowanie współbieżnością w informatyce zapoczątkowało artykuł badawczy opublikowany przez Edsgera W. Dijkstrę w 1965 r. W tym artykule zidentyfikował i rozwiązał problem wzajemnego wykluczania, będącego własnością kontroli współbieżności.
Prymitywy współbieżności wysokiego poziomu
W ostatnim czasie programiści otrzymują ulepszone rozwiązania współbieżne z powodu wprowadzenia prymitywów współbieżności wysokiego poziomu.
Ulepszona współbieżność z językami programowania
Języki programowania, takie jak Golang, Rust i Python firmy Google, dokonały niesamowitych zmian w obszarach, które pomagają nam uzyskać lepsze, współbieżne rozwiązania.
Co to jest wątek i wielowątkowość?
Threadto najmniejsza jednostka wykonania, jaką można wykonać w systemie operacyjnym. Sam w sobie nie jest programem, ale działa w programie. Innymi słowy, wątki nie są od siebie niezależne. Każdy wątek dzieli sekcję kodu, sekcję danych itp. Z innymi wątkami. Znane są również jako lekkie procesy.
Wątek składa się z następujących elementów -
Licznik programu, który składa się z adresu następnej instrukcji wykonywalnej
Stack
Zestaw rejestrów
Unikalny identyfikator
MultithreadingZ drugiej strony to zdolność procesora do zarządzania wykorzystaniem systemu operacyjnego poprzez jednoczesne wykonywanie wielu wątków. Główną ideą wielowątkowości jest osiągnięcie równoległości poprzez podzielenie procesu na wiele wątków. Pojęcie wielowątkowości można zrozumieć na poniższym przykładzie.
Przykład
Załóżmy, że uruchamiamy określony proces, w którym otwieramy MS Word, aby wpisać do niego zawartość. Jeden wątek zostanie przypisany do otwarcia MS Word, a inny wątek będzie wymagany do wpisania w nim treści. A teraz, jeśli chcemy edytować istniejący, potrzebny będzie kolejny wątek do wykonania zadania edycji i tak dalej.
Co to jest proces i wieloprocesowość?
ZAprocessdefiniuje się jako jednostkę, która stanowi podstawową jednostkę pracy do zaimplementowania w systemie. Mówiąc prościej, piszemy nasze programy komputerowe w pliku tekstowym, a kiedy wykonujemy ten program, staje się on procesem, który wykonuje wszystkie zadania wymienione w programie. Podczas cyklu życia procesu przechodzi przez różne etapy - Start, Gotowość, Uruchomienie, Oczekiwanie i Zakończenie.
Poniższy diagram przedstawia różne etapy procesu -
Proces może mieć tylko jeden wątek, zwany wątkiem podstawowym, lub wiele wątków mających własny zestaw rejestrów, licznik programu i stos. Poniższy diagram pokaże nam różnicę -
Multiprocessing,z drugiej strony jest to użycie dwóch lub więcej jednostek CPU w jednym systemie komputerowym. Naszym głównym celem jest wykorzystanie pełnego potencjału naszego sprzętu. Aby to osiągnąć, musimy wykorzystać pełną liczbę rdzeni procesora dostępnych w naszym systemie komputerowym. Najlepszym podejściem do tego jest wieloprocesowość.
Python to jeden z najpopularniejszych języków programowania. Oto kilka powodów, które sprawiają, że nadaje się do jednoczesnych aplikacji -
Cukier syntaktyczny
Cukier składniowy to składnia w języku programowania, która ma na celu ułatwienie czytania lub wyrażania. Sprawia, że język jest „słodszy” dla ludzkiego użytku: rzeczy można wyrazić jaśniej, bardziej zwięźle lub w alternatywnym stylu opartym na preferencjach. Python zawiera metody Magic, które można zdefiniować tak, aby działały na obiektach. Te magiczne metody są używane jako cukier syntaktyczny i są powiązane z łatwiejszymi do zrozumienia słowami kluczowymi.
Duża społeczność
Język Python był świadkiem ogromnego wskaźnika adopcji wśród analityków danych i matematyków, pracujących w dziedzinie sztucznej inteligencji, uczenia maszynowego, głębokiego uczenia się i analizy ilościowej.
Przydatne interfejsy API do programowania współbieżnego
Python 2 i 3 mają dużą liczbę interfejsów API przeznaczonych do programowania równoległego / współbieżnego. Najpopularniejsze z nich tothreading, concurrent.features, multiprocessing, asyncio, gevent and greenlets, itp.
Ograniczenia Pythona we wdrażaniu współbieżnych aplikacji
Python ma ograniczenie dla współbieżnych aplikacji. To ograniczenie nazywa sięGIL (Global Interpreter Lock)jest obecny w Pythonie. GIL nigdy nie pozwala nam na wykorzystanie wielu rdzeni procesora, dlatego możemy powiedzieć, że w Pythonie nie ma prawdziwych wątków. Możemy zrozumieć koncepcję GIL w następujący sposób -
GIL (Global Interpreter Lock)
Jest to jeden z najbardziej kontrowersyjnych tematów w świecie Pythona. W CPythonie GIL jest muteksem - blokadą wzajemnego wykluczania, która zapewnia bezpieczeństwo wątków. Innymi słowy, możemy powiedzieć, że GIL zapobiega równoległemu wykonywaniu kodu Pythona przez wiele wątków. Blokada może być utrzymywana tylko przez jeden wątek naraz, a jeśli chcemy wykonać wątek, musi najpierw uzyskać blokadę. Poniższy diagram pomoże ci zrozumieć działanie GIL.
Jednak istnieją biblioteki i implementacje w Pythonie, takie jak Numpy, Jpython i IronPytbhon. Biblioteki te działają bez interakcji z GIL.