Stackless Python software | |
---|---|
Genere | |
Sviluppatore | Anselm Kruis (sviluppatore), Christian Tismer (autore originale) |
Data prima versione | 1998 |
Ultima versione | 3.8.1-slp (22 gennaio 2020) |
Ultima beta | 3.9.0 alpha 0 |
Sistema operativo | Linux macOS Microsoft Windows |
Linguaggio | C Python |
Licenza | Python Software Foundation License (licenza libera) |
Sito web | github.com/stackless-dev/stackless/wiki |
Stackless Python, o Stackless, è una variante dell'interprete Python che offre un approccio innovativo alla gestione dello stack. Stackless utilizza un proprio meccanismo di gestione dello stack, indipendente dallo stack C sottostante. Questo permette di creare un numero praticamente illimitato di microthread senza preoccuparsi di esaurire lo stack. [1]
Stackless, inoltre, supporta le coroutine e i canali. Le prime sono una forma di multitasking cooperativo che consente a diversi task di condividere lo stesso thread. I canali, invece, forniscono un meccanismo di comunicazione tra microthread ispirato ai CSP (Communicating Sequential Processes) permettendo di scambiare dati tra diversi task in modo sicuro e sincronizzato.
Con Stackless Python, un programma in esecuzione viene suddiviso in microthread gestiti dall'interprete del linguaggio stesso e non dal kernel del sistema operativo. A differenza dei thread tradizionali del sistema operativo, i microthread, sono molto più leggeri e richiedono meno risorse per essere creati e gestiti. Questi microthread simulano una sorta di multitasking interno a un singolo processo, senza dover ricorrere ai costosi context switch del sistema operativo.
I microthread offrono un modo efficiente per gestire l'esecuzione concorrente di diverse sotto-attività all'interno di un singolo processo, sfruttando un singolo core della CPU. Pertanto, rappresentano un'alternativa alla programmazione asincrona basata sugli eventi ed evitano il sovraccarico dovuto all'utilizzo di thread separati per programmi single-core (in quanto non è necessario effettuare alcun passaggio tra la modalità utente e quella kernel, riducendo in questo modo l'utilizzo della CPU).
Stackless Python, pur facilitando la gestione di microthread su un singolo core, non risolve il problema del Global Interpreter Lock (GIL) di CPython. Quindi anche se Stackless Python permette di creare molti microthread, questi possono comunque essere eseguiti solo uno alla volta su un singolo core della CPU. In tal senso il parallelismo risulta limitato (la preemption non inizialmente disponibile in Stackless è stata introdotta seppur in forma limitata). [2]
A causa delle considerevoli modifiche al core di Python, Stackless Python non può essere integrato come una semplice libreria in un'installazione esistente. Richiede invece un'installazione completa e indipendente.
La maggior parte delle funzionalità di Stackless sono state implementate anche in PyPy, un interprete Python che agisce anche come compilatore Just-In-Time (JIT). [3]
Sebbene Stackless sia una un'installazione completa e indipendente, la sua funzionalità di commutazione è stata mutuata con successo come estensione CPython chiamata greenlet. [4] Viene utilizzato da numerose librerie (ad esempio gevent [5]) per fornire una soluzione di threading ecologica per CPython.
Stackless è ampiamente utilizzato nell'implementazione del videogioco MMORPG sandbox ambientato nello spazio EVE Online. Anche IronPort, azienda nota per le sue innovative soluzioni di sicurezza per la posta elettronica, ha sfruttato la potenza di Stackless Python per costruire sistemi altamente efficienti e scalabili.