• Nie Znaleziono Wyników

Dwa węże w cenie jednego. czyli programowanie współbieżne w Pythonie

N/A
N/A
Protected

Academic year: 2022

Share "Dwa węże w cenie jednego. czyli programowanie współbieżne w Pythonie"

Copied!
40
0
0

Pełen tekst

(1)

Dwa węże w cenie jednego

czyli programowanie współbieżne w Pythonie

(2)

CPython vs Anaconda vs PyPy vs ...

(3)

Dlaczego programowanie współbieżne?

Dostępność (np. serwer webowy)

Wydajność (intuicyjnie)

Świat działa w ten sposób

(4)

Concurrent vs Parallel

(5)

GIL - Global Interpreter Lock

(6)

GIL - Mity

Zło w czystej postaci

Zmniejsza wydajność Pythonowego programu

W Pythonie nie da się wykorzystać wielu rdzeni

(7)

GIL - Fakty

Nie pozwala na równoległe wykonanie kodu w obrębie jednego interpretera

Zabezpiecza wewnętrzny stan interpretera przed niespójnością (wyścigi)

Prosty koncept

(8)

A może warto usunąć GILa ?

https://github.com/larryhastings/gilectomy

(9)

Akt I - wątki

(10)

Akt I - wątki

WSPÓŁDZIELĄ

Pamięć (heap)

Kod programu (instrukcje)

Deskryptory plików

NIE WSPÓŁDZIELĄ

Stos

Rejestry (w tym wskaźnik instrukcji)

(11)

Akt I - wątki

Współdzielony stan - brak narzutu na komunikację

Wykonanie w obrębie jednego procesu - brak narzutu na utworzenie procesów

Współdzielony stan powoduje możliwość wystąpienia wyścigów

(12)

Wątki - model z wywłaszczeniem

Manager decyduje o przełączeniu wykonania pomiędzy wątkami

Nie nasza odpowiedzialność - wygoda użycia

Przełączenie może wystąpić w dowolnym momencie

Konieczność zabezpieczenia zasobów współdzielonych, koszt przełączenia

(13)
(14)
(15)
(16)
(17)
(18)
(19)

Wątki - zwiększenie wydajności

Dla programów o dużej ilości operacji IO

Maksymalizują wykorzystanie jednego rdzenia

Narzut na przełączanie

numpy, Numba

(20)

Koniec aktu I - czas zabić wątek

(21)

Akt II - procesy

(22)

Akt II - procesy

Nie współdzielą pamięci - brak wyścigów

Wykorzystanie wielu rdzeni

Narzut na komunikację

Narzut na uruchomienie

(23)

Sky is the limit - prawo Amdahla

(24)

Akt II - Proces rezerwacji i procesy

(25)

Akt II - Wątki i procesy razem

https://bugs.python.org/issue27422

(26)

Akt II - Gdy brakuje rdzeni

https://dask.org/

(27)

Akt III - asyncio

(28)

Różne podejścia do asynchroniczności

Callbacki

Kolejka

Korutyna

(29)

Asyncio - model kooperatywny

Wykonanie w jednym wątku

Sami decydujemy kiedy się przełączyć

Brak potrzeby locków, sekcji krytycznej

Żadne wywołanie nie może być blokujące

Wykorzystanie jednego rdzenia

Przełączanie bardzo tanie

Brak narzutu na synchronizację

Potrzebny cały asynchroniczny ekosystem

(30)

native coroutine vs asynchronous generator

(31)
(32)

Asynchroniczna aplikacja

Asynchroniczny serwer + framework

Asynchroniczny dostęp do bazy (GINO, asyncpg)

Asynchroniczny dostęp do systemu plików

Żadne wywołanie nie może być blokujące

(33)

Akt IV - Celery

Rozproszony system przetwarzania zadań

Zadanie -> Kolejka -> Worker -> Wykonanie

Łatwo dodać do istniejącego projektu

Nadzór nad wykonywanymi zadaniami

(34)

Flower

(35)

Akt V - podsumowanie - wątki

Wykorzystanie jednego rdzenia (GIL, wzrost wydajności gdy dużo IO)

Model z wywłaszczeniem - musimy zabezpieczyć stan systemu przed wyścigami

Wykorzystują istniejący ekosystem bibliotek

Trudno napisać poprawny kod, trudno utrzymać

(36)

Akt V - podsumowanie - procesy

Wykorzystanie wielu rdzeni ale narzut na komunikację

Dla problemów, które możemy zrównoleglić i przetwarzać części względnie niezależnie

Gdy dodatkowo potrzebna optymalizacja względem IO można łączyć z wątkami lub asyncio

(37)

Akt V - podsumowanie - asyncio

Wykorzystanie jednego rdzenia, oddanie sterowania przy operacjach IO do innego zadania

Model kooperatywny, pozwalamy na wykonanie innego zadania za pomocą await

Kod dużo prostszy w utrzymaniu niż dla programu wielowątkowego

Wymaga całego asynchronicznego ekosystemu

(38)

Akt VI - Subinterpreters

Bez narzutu procesów i bez ograniczeń GILa

Aktualnie: Draft, PEP 554

(39)

Materiały, linki

Raymond Hettinger: https://www.youtube.com/watch?v=9zinZmE3Ogk

Real Python: https://realpython.com/async-io-python/

Łukasz Langa: https://www.youtube.com/watch?v=l4Nn-y9ktd4

Dokumentacja (Python stdlib, PEP, Tornado, Dask, Numba, …) oraz artykuły (uwaga!)

Larry Hastings: https://www.youtube.com/watch?v=P3AyI_u66Bw

(40)

www.linkedin.com/in/lewandowski-mikolaj

Blog: PyJazz.pl

Cytaty

Powiązane dokumenty

Argument sid jest numerem identyfikacyjnym zestawu semaforów zwróconym przez funkcję semget(), zaś numer_semafora jest kolejnym numerem semafora w zestawie licząc

Funkcje i klasy dające możliwie prosty sposób wyrażania operacji na reprezentacjach przetwarzanych informacji..

Gwoli jednoznaczności przyjmijmy, że każdą niezerową liczbę z przedziału [0, 1] reprezentujemy przez jej rozwinięcie dziesiętne, w którym jest nieskończenie wiele cyfr

Symbol su- meryjski dwóch węży pojawia się, jak wi- dać, także w Egipcie i również jest zwią- zany z bogiem uzdrawiającym – prze- piękny relief w świątyni faraona Setiego

as a matter of fact, the analysis of the original Pavol dobšinský collection of Slovak fairy tales showed that there are certain stylistic features (pronouns, particles,

[4 ] Mark Mitchell, Jefrey Oldham, Alex Samuel, LINUX Programowanie dla zaawansowanych RM 2002. Salama; UNIX Programowanie systemowe, RM

Przełączanie między wątkami, aczkolwiek jest szybsze niż przełączanie między osobnymi procesami, wciąż jednak generuje dodatkowy narzut.. Należy więc ograniczyć liczbę

Niekiedy chodzi o wykonanie brawury w oczach całego świata, przed chłodnymi źrenicami historii, a wówczas najgłośniejsi z widzów upajają się śmiertelną męką