20.06.2025. ·
5 min

Python konačno uklanja GIL: PEP 703 donosi pravi paralelizam do 2028. godine

HelloWorld
0
Python konačno uklanja GIL: PEP 703 donosi pravi paralelizam do 2028. godine

Posle decenija čekanja, Python programeri konačno mogu da se raduju - Global Interpreter Lock (GIL) se postupno uklanja iz Python-a. Python komitet je u julu 2023. odobrio PEP 703, koji predstavlja najambiciozniji pokušaj uklanjanja GIL-a u istoriji programskog jezika.

PEP 703, koji je razvio Sem Gros iz kompanije Meta, donosi tehniku pristrasnog brojanja referenci koja omogućava bezbedno brojanje referenci u višenitnom okruženju bez značajnog uticaja na performanse programa sa jednom niti. Ovo je ključna razlika u odnosu na sve prethodne neuspešne pokušaje uklanjanja GIL-a.

Već u Python 3.13 (objavljen oktobra 2024.) možete da eksperimentišete sa režimom slobodnih niti koji omogućava potpuno korišćenje višejezgarnih procesora. Plan je da GIL postane opcion do 2026-2027, a potpuno se ukloni kao podrazumevano ponašanje do 2028-2030. godine.

Šta je GIL i zašto predstavlja problem za savremene aplikacije

Global Interpreter Lock je mutex koji sprečava istovremeno izvršavanje Python bajtkoda u više niti. Uveden je 1992. godine kada su višejezgarni procesori bili naučna fantastika, a glavni cilj je bio jednostavnost upravljanja nitima i zaštita od uslova trke.

Problem je što GIL ograničava Python na jedno jezgro procesora bez obzira na to koliko ih vaš sistem ima. Ovo posebno pogađa:

  • Aplikacije veštačke inteligencije i mašinskog učenja koje rade sa velikim skupovima podataka
  • Naučne kalkulacije koje mogu biti paralelizirane
  • Veb servere koji služe veliki broj istovremenih zahteva
  • Aplikacije u realnom vremenu koje zahtevaju maksimalni protok

Trenutna rešenja poput modula multiprocessing imaju značajna ograničenja – svaki proces zahteva sopstvenu instancu Python tumača i memorijski prostor, što stvara dodatno opterećenje do nekoliko stotina megabajta po procesu. Komunikacija između procesa je skupa i složena za implementaciju.

Tehnička analiza PEP 703: Pristrasno brojanje referenci kao preokret

Ključna inovacija PEP 703 je tehnika pristrasnog brojanja referenci koju su prvi put opisali Džiho Čoi, Tomas Šul i Žosep Torejas 2018. godine. Pristrasno brojanje referenci zasnovano je na zapažanju da većina objekata u višenitnim programima biva pristupana samo od strane jedne niti.

Kako pristrasno brojanje referenci funkcioniše:

  • Svaki objekat ima "lokalni" i "deljeni" broj referenci
  • Nit koja je kreirala objekat (vlasnik) koristi neatomerske instrukcije za lokalni broj
  • Ostale niti koriste atomske instrukcije za deljeni broj
  • Ovaj dizajn izbegava skupe atomske operacije čitanja-modifikacije-pisanja na savremenim procesorima

Dodatno, PEP 703 uvodi besmrtne objekte - objekti poput None, True, False postaju "besmrtni" i njihovi brojevi referenci se nikad ne menjaju. Ovo eliminiše nadmetanje kada više niti istovremeno pristupa ovim često korišćenim objektima.

Odloženo brojanje referenci dalje optimizuje performanse odlaganjem nekih operacija brojanja referenci, što smanjuje dodatno opterećenje u višenitnom okruženju.

Implementacija takođe koristi mimalloc alokator memorije koji omogućava bezbedne operacije nad kolekcijama poput dict bez zaključavanja tokom operacija samo za čitanje.

Postupni plan uklanjanja GIL-a: Python 3.13 do 3.15

Python komitet je definisao trofazni plan za uklanjanje GIL-a:

Prva faza (Python 3.13 - 2024):

  • Eksperimentalni režim --disable-gil prilikom kompajliranja
  • Dva odvojena binarna interfejsa - sa i bez GIL-a
  • Programeri proširenja moraju ciljati oba interfejsa
  • Aktivacija preko opcije --free-threading

Druga faza (Python 3.14/3.15 - 2026-2027):

  • GIL kontrolisan promenljivom okruženja tokom izvršavanja
  • GIL ostaje podrazumevano ponašanje, ali jedinstveni binarni interfejs
  • Ponovna integracija specijalizujućeg tumača (trenutno onemogućen u režimu slobodnih niti)

Treća faza (Python 3.15/3.16 - 2028-2030):

  • GIL onemogućen po podrazumevanim postavkama
  • Mogućnost uključivanja radi kompatibilnosti sa nasleđenim kodom

Trenutno u Python 3.13.2, režim slobodnih niti ima oko 40% dodatnog opterećenja na skupu testova pyperformance. Glavni uzrok je što je specijalizujući tumač (PEP 659) onemogućen. Cilj je smanjiti dodatno opterećenje na 10% ili manje do Python 3.14.

Izazovi i ograničenja trenutne implementacije

Python sa slobodnim nitima 3.13 ima nekoliko važnih ograničenja koje programeri moraju imati na umu:

Problem potrošnje memorije: Besmrtni objekti se nikad ne oslobađaju, što može dovesti do povećane potrošnje memorije u aplikacijama koje kreiraju mnogo stringova, brojeva ili tipova. Ovo će biti rešeno u Python 3.14.

Kompatibilnost C proširenja: Proširenja napisana u C-u moraju biti specifično kompajlirana za verziju sa slobodnim nitima. Postojeća proširenja će automatski uključiti GIL kada se uvoze, što poništava prednosti.

Bezbednost objekata okvira: Nije bezbedno pristupati objektima okvira iz drugih niti - ovo može srušiti tumač. sys._current_frames() nije siguran za korišćenje.

Bezbednost iteratora: Deljenje istog objekta iteratora između niti može dovesti do propuštenih ili duplikatnih elemenata.

Numpy i naučni stek: Trenutno većina naučnih Python paketa nije prilagođena režimu slobodnih niti. Quansight Labs vodi koordinisan napor za kompatibilnost sa slobodnim nitima naučnog Python ekosistema.

Posledice za Python ekosistem i buduće programiranje

Uklanjanje GIL-a će imati dalekosežne posledice za Python ekosistem:

Za održavaoce biblioteka:

  • Potreba za podrškom dva binarna interfejsa tokom prelaznog perioda
  • Otpremanje odvojenih paketa na PyPI za verzije sa i bez GIL-a
  • Preispitivanje pretpostavki o bezbednosti niti u postojećem kodu

Za aplikacije:

  • Radni tokovi veštačke inteligencije i mašinskog učenja moći će da koriste sva jezgra procesora prirodno
  • Veb radni okviri će imati značajno bolji protok
  • Eliminacija potrebe za složenu arhitekturu više procesa

Za performanse:

  • CodSpeed testovi pokazuju da PageRank algoritam postižu linearno ubrzanje sa brojem jezgara u režimu slobodnih niti
  • Aplikacije koje provode vreme u C proširenjima ili operacijama ulaza/izlaza neće videti veliku razliku
  • Aplikacije sa jednom niti će imati dodatno opterećenje dok se optimizacije ne završe

Meta je obećala tri inženjerske godine podrške za implementaciju PEP 703 do kraja 2025. godine, što pokazuje ozbiljnost tehnološkog giganta u vezi sa ovim projektom.

Python samit u aprilu 2025. fokusiraće se na budućnost implementacije bez GIL-a i na to da li će postati podrazumevano ponašanje u Python 3.15 ili kasnijim verzijama.

Za Python programere, ovo predstavlja najveću promenu u arhitekturi jezika od uvođenja asyncio biblioteke. Vreme je da počnete da eksperimentišete sa opcijom --free-threading i pripremite vaše aplikacije za budućnost bez GIL-a.

 

Oceni tekst

0

0 komentara

Iz ove kategorije

Svi članci sa Bloga

Slični poslovi

Povezane kompanije po tagovima