Domanda

Ci sono molte domande relative alla Stackless Python. Ma nessuno di rispondere a questa mia domanda, penso (mi corregga se sbagliato - per favore!). C'è un po 'di brusio su di esso tutto il tempo in modo curioso di sapere. Che cosa avrei usare Stackless per? Come è meglio di CPython?

Si ha fili verdi (stackless) che permettono di creare rapidamente molti fili leggeri finché non si eseguono operazioni di blocco (qualcosa come le discussioni di Ruby?). Che cosa è questo grande per? Quali altre caratteristiche deve voglio usare nel corso CPython?

È stato utile?

Soluzione

Permette di lavorare con grandi quantità di concorrenza. Nessuno sano di mente avrebbe creato centomila thread del sistema, ma è possibile farlo usando stackless.

Questo articolo test facendo proprio questo, la creazione di un centinaio di migliaia tasklets sia in Python e Google Go (un nuovo linguaggio di programmazione): http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

Sorprendentemente, anche se Google Go viene compilato in codice nativo, e tout loro attuazione co-routine, Python vince ancora.

Stackless sarebbe un bene per l'implementazione di una mappa / ridurre algoritmo, dove si può avere un numero molto elevato di riduttori a seconda dei dati di input.

Altri suggerimenti

vantaggio principale di Stackless Python è il supporto per coroutine molto leggeri. CPython non supporta nativamente coroutine (anche se mi aspetto che qualcuno per pubblicare un hack generatore-based nei commenti) in modo illimitato: è un netto miglioramento sul CPython quando si dispone di un problema che beneficia coroutine.

Credo che l'area principale in cui eccellono sono quando si hanno molte attività simultanee in esecuzione all'interno del programma. Esempi possono essere entità di gioco che esegue uno script di loop per la loro intelligenza artificiale, o di un server web che sta servendo molti clienti con pagine che sono lenti per creare.

Hai ancora molti dei problemi tipici con la concorrenza correttezza tuttavia per quanto riguarda i dati condivisi, ma la commutazione compito deterministica rende più facile la scrittura di codice sicuro in quanto si sa esattamente dove il controllo verrà trasferito e quindi conosce i punti esatti in cui il condivisi stato deve essere aggiornato.

Thirler già accennato che stackless è stato utilizzato in Eve Online. Tenete a mente, che:

  

(..) stackless aggiunge un ulteriore tocco di questo permettendo compiti da separati in attività più piccole, Tasklets, che possono poi essere separato durante il programma principale da eseguire per conto proprio. Questo può essere usato per compiti, come l'invio di una e-mail al largo, o l'invio di un evento, o per le operazioni di IO, ad esempio fire-and-forget inviare e ricevere pacchetti di rete. Una tasklet attende un pacchetto dalla rete, mentre altri continuano a funzionare il ciclo di gioco.

     

E 'in un certo senso, come le discussioni, ma è non-preemptive ed esplicitamente prevista, quindi ci sono meno problemi con la sincronizzazione. Inoltre, il passaggio tra tasklets è molto più veloce di commutazione filo, e si può avere un numero enorme di tasklets attivi, mentre il numero di thread è fortemente limitata dall'hardware del computer.

(ottenuto questa citazione da qui )

Al PyCon 2009 v'è stato dato un discorso molto interessante , che descrive come e perché Stackless viene utilizzato a CCP Games.

Inoltre, v'è un ottimo introduttivo materiale, che descrive il motivo per cui stackless è una buona soluzione per le applicazioni. (Può essere un po 'vecchio, ma penso che vale la pena di lettura).

EVE Online è in gran parte programmato in Stackless Python. Hanno diversi blog dev su l'uso di esso. Sembra che è molto utile per calcolo ad alte prestazioni.

Anche se non ho usato Stackless stesso, ho usato Greenlet per implementare applicazioni di rete altamente concorrenti. Alcuni dei casi d'uso Linden Lab ha messo verso sono: alte prestazioni proxy intelligenti, un sistema veloce per la distribuzione di comandi più di un gran numero di macchine, e un'applicazione che fa un sacco di scritture di database e legge (con un rapporto di circa 1 : 2, che è molto scrivere-pesante, quindi è trascorrere la maggior parte del suo tempo di attesa per il database per tornare), e di una web-crawler-tipo-cosa per i dati web interni. In pratica qualsiasi applicazione che è in attesa di avere a che fare un sacco di rete di I / O beneficiare di essere in grado di creare un thread bajillion leggero. 10.000 client collegati non sembra un grande affare per me.

Stackless o Greenlet non sono realmente una soluzione completa, però. Essi sono di livello molto basso e si sta andando ad avere a che fare un sacco di monkeywork per creare un'applicazione con loro che li utilizza al loro massimo. Lo so perché io sostengo una libreria che fornisce un livello di rete e la pianificazione in cima Greenlet, proprio perché la scrittura di applicazioni è molto più facile con esso. Ci sono un sacco di questi ora; Io sostengo Eventlet, ma c'è anche Concurrence, chirali, e probabilmente un po 'di più che io non so.

Se il tipo di applicazione che si desidera scrivere suona come quello che ho scritto su, prendere in considerazione una di queste librerie. La scelta di Stackless vs Greenlet è un po 'meno importante di decidere che cosa biblioteca meglio si adatta alle esigenze di ciò che si vuole fare.

L'utilità di base per fili verdi, il modo di vedere, è quello di realizzare un sistema in cui si ha una grande quantità di oggetti che fanno operazioni ad alta latenza. Un esempio concreto sarebbe in comunicazione con altre macchine:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

Le discussioni permettono di scrivere il codice di cui sopra, naturalmente, ma se il numero di oggetti è abbastanza grande, le discussioni solo non può svolgere in modo adeguato. Ma è possibile utilizzare fili verdi anche per davvero in grandi quantità. Il request_information() di cui sopra potrebbe passare fuori a qualche scheduler dove altro lavoro è in attesa e tornare più tardi. È possibile ottenere tutti i vantaggi di essere in grado di chiamare "blocco" funzioni di come se tornano immediatamente senza utilizzare fili.

Questo è ovviamente molto utile per qualsiasi tipo di calcolo distribuito, se si vuole scrivere il codice in modo semplice.

E 'anche interessante per più core di mitigare in attesa di serrature:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

La funzione green_lock sarebbe sostanzialmente tentare di acquisire il blocco e basta passare ad uno scheduler principale se non riesce a causa di altri core utilizzando l'oggetto.

Ancora, fili verdi vengono utilizzati per attenuare il blocco, consentendo codice da scrivere naturalmente e ancora eseguire bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top