4 lip 2010

Python - problemy

Tym razem kilka słów o niedoskonałościach Pythona, które powodują, że zostaje on nieco w tyle za chociażby Javą. Zacznijmy od tego, że Java dysponuje bardzo zaawansowaną maszyną wirtualną. Umożliwia ona współbieżne wykonywanie kilku wątków. Dla przykładu zademonstruję program, który zgodnie z wszelaką logiką powinien wykonywać się współbieżnie. Zakładamy, że oba wątki nie korzystają ze wspólnych danych i nie potrzebujemy tutaj żadnych blokad, które mogłyby być przeszkodą do wykonywania współbieżnego.


#!/usr/bin/env python

from threading import Thread

class moj_watek(Thread):
def __init__(self):
Thread.__init__(self)

def run(self):
a = 1
while(1): a+=a/2

watek = moj_watek()
watek.start()
b = 1
while 1: b+=b/2


Po uruchomieniu programu chcielibyśmy, aby nasz kod był równolegle wykonywany na dwóch procesorach (tyle mam w laptopie). Przypatrzmy się zatem, co się dzieje w komputerze po uruchomieniu programu:



Widzimy, że procesory są używane tylko w ok. 50%, chociaż dwa wątki powinny zajmować cały czas obu procesorów. Dlaczego? Python ma w sobie wbudowaną blokadę - tzw. Global Interpreter Lock (GIL). Dobry opis tego problemu w języku polskim można znaleźć tutaj: "Python, wątki i GIL. Fakty i mity."
Problem jest o tyle poważny, że obecnie współbieżność programów w Pythonie uzyskuje się tworząc wiele procesów. Oczywiście ten sposób jest bardzo uciążliwy (powolność IPC, problem z przekazywaniem otwartych deskryptorów gniazd i plików etc.). Jednym z celów wersji 3.2 jest zmodyfikowanie GIL-a tak, aby zamiast zliczania instrukcji kodu bajtowego Pythona opierała się na pomiarze czasu, co pozwoliłoby uniknąć problemów opisanych tutaj: Inside the Python GIL.

Z drugiej strony mamy jeszcze inne implementacje Pythona niż standardowy CPython. Warto tutaj wspomnieć o Jythonie, czyli o implementacji Pythona w Javie. Tutaj wielowątkowość w żaden sposób nie jest problematyczna, a pojęcie globalnej blokady interpretera fizycznie nie istnieje.

Jeszcze jedna sprawa. Python po kilkunastu latach istnienia doczekał się w końcu własnego JIT-a, bazującego na LLVM. W wersji 3.3 wysiłki projektu Unladen Swallow zostaną zintegrowane z oryginalnym CPythonem. Dokładny opis zamieszczony jest tutaj: integracja Unladen Swallow. Co prawda nie osiągnięto założonego, pięciokrotnego przyspieszenia, jednak sami autorzy przyznają, że potencjał technologii JIT jest tak duży, że nawet nie zbliżyli się do jej pełnego wykorzystania. Miejmy więc nadzieję, że wysiłek pracowników Google, autorów LLVM oraz twórców Pythona pozwoli w końcu mocno przyspieszyć ten jakże efektywny dla programisty język.

0 komentarze:

Prześlij komentarz