Python gebruikt een mechanisme dat Global Interpreter Lock heet, of kortweg GIL, waarmee slechts één reeks bytecode-instructies (thread) tegelijk kan worden uitgevoerd. GIL biedt belangrijke voordelen, omdat het
- zorgt voor thread-veiligheid
- verbetert de prestaties van single-threaded programma’s
- vereenvoudigt de integratie van niet-thread-safe C-bibliotheken met Python
Tegelijkertijd creëert de GIL een knelpunt voor multithreaded programma’s die zijn ontworpen om meerdere workflows tegelijk uit te voeren. Hierdoor kan niet optimaal worden geprofiteerd van moderne multicore processoren, die meerdere taken tegelijk kunnen uitvoeren.
Er is veel discussie geweest over het verwijderen van de GIL. Er is echter geen haalbare oplossing uitgewerkt omdat er te veel Python-functies, -modules en -pakketten aan gekoppeld zijn. Bovendien zou het schrappen van de GIL de prestaties van software met een single-threaded architectuur verslechteren.
Om de beperking van de GIL te overwinnen, kun je het multiprocessing-pakket van Python gebruiken, dat het gebruik van talrijke subprocessen in plaats van threads mogelijk maakt. In dit scenario gebruikt elk proces zijn eigen interpreter en geheugenruimte, terwijl het besturingssysteem de parallelle uitvoering van opdrachten over verschillende CPU-kernen plant. In feite gebruiken we nog steeds aparte threads voor elk proces; terwijl bij multithreading alle parallel uitgevoerde processen dezelfde geheugenruimte delen.
Maar parallellisme heeft één groot nadeel: het verslindt veel geheugenruimte.