Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nie taki GIL straszny...

Nie taki GIL straszny...

Co to jest GIL w Pythonie, jak działa i jak z tym żyć.

Tomek Wójcik

August 05, 2014
Tweet

More Decks by Tomek Wójcik

Other Decks in Programming

Transcript

  1. Co to jest GIL? • Najczęściej powtarzany argument przeciwko używaniu

    Pythona :). • Wewnętrzny mechanizm ograniczający użycie interpretera Pythona przez wątki.
  2. Skoro już mówimy o wątkach • Wątki w Pythonie są

    natywne. • System operacyjny zarządza wątkami programów w Pythonie tak jak wątkami programów w np. C. • Python nie ma swojego schedulera.
  3. Część wspólna def work(start, end):! i = start! result =

    0! while i <= end:! result += i! i += 1! ! return result
  4. Jeden wątek import time! ! from demo_lib import work! !

    start = time.time()! work(1, 50000000)! print time.time() - start
  5. Dwa wątki from threading import Thread! import time! ! from

    demo_lib import work! ! worker1 = lambda: work(1, 25000000)! worker2 = lambda: work(25000000, 50000000)! thread1 = Thread(target=worker1)! thread2 = Thread(target=worker2)! ! start = time.time()! thread1.start(); thread2.start()! thread1.join(); thread2.join()! print time.time() - start
  6. Jak działa GIL? • GIL ogranicza ilość wątków, które w

    danej chwili wykonują kod w Pythonie. • Wątki alokują i zwalniają GIL. • Intepreter może kazać wątkowi zwolnić GIL i zatrzymać wykonanie.
  7. Kiedy GIL jest zwalniany? • Kiedy wątek przechodzi w stan

    uśpienia (np. czeka na operację I/O). • Kiedy kod w C (np. funkcja time.sleep()) zwolni GIL. • Co 100 “tyknięć” wewnętrznego licznika operacji w interpreterze.
  8. “100 tyknięć”? • Interpreter limituje ilość instrukcji, które wątek może

    wykonać w jednej “sesji”. • Gdy wątek wykona ilość instrukcji odpowiadającą 100 “tyknięciom”, interpreter wymusza jego uśpenie. • Interpreter wysyła sygnał do innych wątków, żeby się obudziły. • OS wybiera wątek, który będzie działał następny. • Wybrany przez OS wątek alokuje GIL i zaczyna wykonywać instrukcje.
  9. Metoda “100 tyknięć” • Mechanizm przeciwdziałania przejęciu intepretera przez jeden

    wątek. • Nie sprawdza się na wielordzeniowych maszynach. • Zastąpiona w Pythonie 3.2+ przez mechanizm timeoutów (który dla odmiany może psuć I/O).
  10. #corobićjakżyć • Unikać wykonywania operacji na CPU w Pythonie. •

    Zastąpić wątki procesami. • Zmienić interpreter. • Zmienić język programowania.
  11. import multiprocessing from multiprocessing import Process! import time! ! from

    demo_lib import work! ! worker1 = lambda: work(1, 25000000)! worker2 = lambda: work(25000000, 50000000)! process1 = Process(target=worker1)! process2 = Process(target=worker2)! ! start = time.time()! process1.start(); process2.start()! process1.join(); process2.join()! print time.time() - start
  12. A na serio? • GIL spowolni program dopiero gdy kod

    zacznie obrabiać duże ilości danych w Pythonie na wielu wątkach. • Wątki są super jeśli Twoja aplikacja jest zależna od I/O. • Obliczenia realizuj na procesach w tle albo w C.