Python bez GILa?! Jest proof of concept!

Cześć.

Ostatnio w moje ręce wpadł proof of concept CPythona który został pozbawiony GILa. Niedawno na blogu pojawił się artykuł o wielowątkowości i równoległości, więc nie jestem w stanie przejść obok tej nowinki obojętnie.

Czym jest GIL?

Jestem prawie pewien, że mimo tego, że jest to dość sławna bolączka Pythona, to wiele osób nie wie czym GIL jest. Spieszę więc wyjaśnić. GIL to po rozwinięciu Global Interpreter Lock, czyli globalny mutex, który nie pozwala wielu wątkom używać interpretera w tym samym czasie. Niesie to za sobą poważne konsekwencje, ponieważ istnienie GILa sprawia, że Python praktycznie nie posiada prawdziwej wielowątkowości. Nie zrozum mnie źle, nie jest to jakiś ogromny problem. Ja, jak i wielu programistów Pythona, posiadam alternatywne rozwiązania jak multiprocessing czy programowanie asynchroniczne. Mimo wszystko, są pewne obszary zastosowań, w których właśnie z tego powodu Pythona nie ma sensu używać.

Trochę więcej informacji o wątkach i procesach w Pythonie umieściłem w tym artykule. Sugeruję przeczytać go, zanim przejdziesz do dalszego czytania tego wpisu.

Mamy PoCa

Implementacja Pythona bez tej sławnej blokady została opisana w tym dokumencie. Znajdują się tam informację o konkretnych decyzjach technicznych jak i pojedyncze testy wydajności. Ogólnie wygląda to nieźle. Autor, Sam Gross, wyszedł z gałęzi Pythona 3.9, więc właśnie tę wersję dostaliśmy bez blokady GIL.

Jak czytałem o tym newsie, to byłem pewien, że będę chciał się z Tobą tym podzielić. Oczami wyobraźni widziałem nie zawsze bezproblemową kompilację Pythona. Na szczęście autor zadbał o dostarczenie obrazu Dockera, więc nową zabawką można się bawić bez niepotrzebnych początkowych komplikacji.

Przykład

Weźmy przykład ze wspomnianego przeze mnie artykułu, który potwierdza istnienie GILa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import time
from threading import Thread


def long_running_cpu_task():
  for _ in range(100000000):
      pass


threads = []

for _ in range(10):
  threads.append(Thread(target=long_running_cpu_task))

start = time.time()

for t in threads:
  t.start()

for t in threads:
  t.join()

stop = time.time()
print("Exec time for threads:", stop-start, "[s]")

Wykonuje się on na moim komputerze (standardowy CPython) około 20s:

Exec time for threads: 20.71875286102295 [s]

Bardzo, bardzo podobny kawałek kodu, wykorzystujący procesy a nie wątki wykonuje się w okolicach 6s.

Pierwszy test Pythona bez GILa

Jak już wspomniałem, autor dostarczył obraz na dockerowego huba, więc pierwsze co pomyślałem, to, że sobie podepnę remote interpreter w PyCharmie. A potem mnie olśniło, że takie fajne rzeczy można robić tylko w wersji Professional. A do testów mam Community. Zostaje więc nam konsola.

Ale nic straconego. Taką komendą:

$ docker run -it --rm --name py-no-gil -v "$PWD":/usr/src/myapp -w /usr/src/myapp colesbury/python-nogil python app.py

możemy uruchomić wskazany przez nas plik (w przykładzie app.py) na kontenerze z Pythonem bez GILa.

Uruchamiam więc wcześniej pokazany kawałek kodu….

$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp colesbury/python-nogil python threads1.py
Exec time for threads: 6.350346803665161 [s]

I mamy to! Czas wykonania się skryptu jest znacznie krótszy (z 20s do 6s) i znajduje się w okolicach czasu, jaki potrzebuje standardowy Python w wersji z wieloma procesami.


Czekaj, stop!

Podoba Ci się to co tworzę? Jeśli tak to zapraszam Cię do zapisania się na newsletter:

Aby potwierdzić swoją subskrypcję, odbierz pocztę i kliknij w link potwierdzający:) jeśli maila nie ma to poczekaj chwile i/lub sprawdź folder spam/inne/oferty itp :)

Aby potwierdzić swoją subskrypcję, odbierz pocztę i kliknij w link potwierdzający:) jeśli maila nie ma to poczekaj chwile i/lub sprawdź folder spam/inne/oferty itp :)
a w ramach prezentu otrzymasz całkowicie za darmo, dwa dokumenty PDF „6 (nie zawsze oczywistych) błędów popełnianych podczas nauki programowania” który jest jednym z efektów ponad siedmioletniej pracy i obserwacji rozwoju niejednego programisty oraz „Wstęp do testowania w Pythonie”, będący wprowadzeniem do biblioteki PyTest.
Jeśli to Cię interesuje to zapraszam również na swoje social media.

Jak i do ewentualnego postawienia mi kawy :)

Czy to koniec GILa?

Na pewno nie. A przynajmniej nie tak szybko. Proof of concept to coś co powinno, jak sama nazwa wskazuje, udowadniać możliwość realizacji pewnej koncepcji. I w pewnym stopniu tutaj się to udało – z dużym prawdopodobieństwem, nawet ten prosty test który zrobiłem, potwierdza brak GILa.

Odbyła się już rozmowa pomiędzy twórcą tego PoC’a a team’em Python Core, którą Łukasza Langa streścił tutaj. W skrócie, można powiedzieć, że zaprezentowane rozwiązanie spotkało się z żywym zainteresowaniem wspomnianego zespołu, ale nie ma konkretów odnośnie przyszłości. Wykluczone zostały plotki o powstaniu Python’a 4, rozgrzebano problem kompatybilności (na bank jakieś rozwiązania opierają się na istnieniu GILa), przedyskutowano opóźnione zliczanie referencji a także kilka innych zmian które pojawiły się wraz z pozbyciem się GILa. Po więcej szczegółów, zapraszam do zlinkowanego przeze mnie artykułu.

Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

Pokaż komentarze

Ostatnie wpisy

Podsumowanie: maj, czerwiec, lipiec i sierpień 2024

Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More

2 miesiące ago

Podsumowanie: kwiecień 2024

Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More

6 miesięcy ago

Podsumowanie: luty i marzec 2024

Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More

7 miesięcy ago

Podsumowanie: styczeń 2024

Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More

9 miesięcy ago

Podsumowanie roku 2023

Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More

10 miesięcy ago

Podsumowanie: grudzień 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More

10 miesięcy ago