Global Interpreter Lock

Pythoni mälu toimub viiteloendusega (reference counting), et mitu lõime ei saaks samaaegselt muuta ühe objekti viitearvu ja tekitada võistlusseisud race conditions, millele järgneks mälu leke või rakenduse kokkujooksmine.

../_images/reference_counting.png

Lahendus oleks olnud luua luku igale objektile, kuid see:

  1. oleks tohutult aeglane (palju lukustamisi ja vabastamisi),

  2. võiks põhjustada tõrkeseisundeid deadlock.

  3. mitmed C-laiendused (nt NumPy) kirjutati eeldusel, et GIL tagab turvalisuse.

GIL lahendus on üksainus lukk kogu CPython interpreetorile.

../_images/gil.png

Paralleelsust saab Pythonis:

  1. Lisades --disable-gil konfiguratsiooni. Mitmelõimelisuse turvalisuseks:
    • viitearvestus lahendati biased reference counting, immortalization, ja deferred reference counting -uga.

    • konteineri-tüüp andmestruktuuridele (nt listid, dict) kerge luku andmisega

    • tõrkeseisundist lahtisaamine stop-the-world pausiga.

Aga seda tehes tasub arvestada,
  • Borrowed references võib vajada turvalisemaid API-sid.

  • Laiendused, mis eeldavad GIL-i, vajavad lisalukustamist

  • Ühelõimelise programmi korral aeglasem töötamine

  • .whl-failid peavad looma uue baitkoodi Build-is GIL-ita

  1. Kasutades teisi interpreetoreid – Jython (Java), IronPython (C#), PyPy (JIT).

  2. Kasutades multiprocessing moodul – iga protsessil on oma interpreetor.

../_images/multiprocessing.png