2014-11-07 12 views
6

Sono interessato a continuations, in particolare nella C-API di Python. Da quello che ho capito, la natura delle continuazioni richiede convenzioni di chiamata a basso livello non astratte per manipolare lo stack di chiamate secondo necessità. Ho avuto la fortuna di incontrare alcuni esempi di questi sparsi here e there. Nei pochi esempi in cui mi sono imbattuto, questa non astrazione viene eseguita utilizzando l'intelligente C (con supposizioni sull'ambiente) o l'assemblaggio personalizzato.Il passaggio a PyFrameObjects in entrata e in uscita può essere una buona implementazione delle continuazioni?

Tuttavia, ciò che è interessante di Python è che ha un proprio stack di interpreti costituito da PyFrameObject s. Supponendo che le applicazioni a thread singolo per ora, , non dovrebbero essere sufficienti per passare in-e-out PyFrameObjects s per implementare le continuazioni in Python C-API? Perché questi autori si preoccupano anche delle cose di basso livello?

+0

Non posso davvero rispondere a questo, ma mi viene in mente l'ottimizzazione. Buona domanda! – ThinkChaos

+2

Scambiare oggetti frame è fondamentalmente come funzionano le funzioni del generatore. Quando si preme 'yield', l'oggetto frame corrente viene salvato sul generatore e estratto dalla pila. Quando è necessario il valore successivo, l'oggetto frame viene reinserito nello stack e l'esecuzione continua dal punto in cui era stata interrotta. –

risposta

1

I generatori lavorano manipolando lo stack (effettivamente l'elenco collegato) degli oggetti frame. Ma questo aiuterà solo per il puro codice Python. Non ti aiuterà se il tuo codice ha un codice C in esecuzione. Ad esempio, se ci si trova in codice C all'interno di una routine I/O, non è possibile modificare l'oggetto frame Python per ottenere l'esecuzione in un'altra posizione. Devi essere in grado di cambiare la pila di C per farlo. Questo è ciò che pacchetti come i greenlet fanno per te.

+0

Penso che questa sia la risposta. Curiosamente, penso che se non hai bisogno che le parti implementate in C partecipino alla festa di continuazione, la manipolazione di 'PyFrameObject's * sarebbe * sufficiente *. In realtà questo è più o meno provato dai generatori e dalle coroutine. – Julian

Problemi correlati