Wybrane aspekty współbieżności w Pythonie 3
Autor: Idego Group

Artykuł omawia koncepcje programowania równoległego i współbieżnego w Pythonie 3.4+, rozróżniając programy współbieżne z wieloma wątkami logicznymi od programów równoległych wykonywanych jednocześnie na wielu rdzeniach.
Procesy utrzymują oddzielne przestrzenie pamięci i interpretery, podczas gdy wątki współdzielą kontekst w ramach jednego procesu. Wątki doskonale sprawdzają się przy obsłudze operacji wejścia/wyjścia, umożliwiając wykonywanie innych zadań w czasie oczekiwania, choć Globalny Interpreter Lock (GIL) ogranicza jednoczesne wykonywanie kodu bajtowego Pythona do jednego wątku.
Istnieje wiele podejść do współbieżności: niskopoziomowy moduł _thread do bezpośredniego zarządzania wątkami, moduł threading z mechanizmami synchronizacji takimi jak blokady, oraz moduł queue do bezpiecznej komunikacji między wątkami. Rozwiązania wyższego poziomu obejmują concurrent.futures z executorami puli wątków i procesów.
Moduł multiprocessing obsługuje zadania wymagające dużej mocy obliczeniowej przy użyciu oddzielnych procesów, a zewnętrzne narzędzia, takie jak integracja OpenMP z Cythonem, oferują dodatkowe opcje. W specjalistycznych przypadkach Parallel Python umożliwia rozproszenie obliczeń na maszynach w sieci.
Wątki Pythona nadają się do zadań ograniczonych przez operacje wejścia/wyjścia, ale słabo sprawdzają się przy zadaniach intensywnie wykorzystujących procesor ze względu na GIL. Rozwiązania oparte na procesach omijają to ograniczenie, ale ponoszą koszty serializacji, wymagając wystarczającej ilości pracy obliczeniowej, aby uzasadnić koszty komunikacji.