Domanda

stackless esperti,

Sono riuscito a creare tasklets sotto Stackless Python (entrambi dal Stackless e il lato C).

Mi sembra che, al fine di creare un tasklet in Stackless, si associa un Python arbitrario callable (funzione) per il tasklet (così come i parametri richiesti), in modo che il callable legato verrebbe eseguito come un tasklet. Tuttavia, un callable arbitraria potrebbe realmente avere un valore di ritorno che è importante per il chiamante. Ma devo ancora vedere un modo per recuperare il valore di ritorno della corsa callable legato come un tasklet.

Sul lato puro Stackless Python, io vedo un idioma utilizzo chiamato Micromanaging, che avvolge la funzione originaria con una funzione di gestione, che a sua volta potrebbero catturare il valore di ritorno della funzione originale e salvare da qualche parte per l'uso in qualche altro contesto.

Sfortunatamente, il mio caso uso speciale comporta la creazione di un tasklet dal C (C ++) laterale, un legame (potenzialmente blocco) Python richiamabile che ha un valore di ritorno importante per essere utilizzato in seguito. Sembra che crei una tale funzione Micromanaging sul lato C non è molto fattibile, poiché non ho trovato un modo per trasformare una funzione C in un modo dinamico richiamabile PyObject (che non prevedono tavolo inizializzazione dei moduli, ecc), e utilizzando stateless statico funzione C (I assumerebbe il prototipo deve essere PyObject * (* PyObject, PyObject *)) è generalmente una cattiva idea in mondo C ++ in ogni modo.

L'API Stackless C anche non sembra contenente una funzione appropriata per recuperare il valore di ritorno di un tasklet. E 'l'unica opzione che devo scrivere sopra la funzione Micromanaging menzionato ( potrebbero essere stateful) in Python, e fornire un modo per recuperare il posto salvato valore di ritorno (in modo stateful, cioè non utilizzando Global variabili)? Oppure ci potrebbero essere altre opzioni avrei potuto esplorare?

La ringrazio molto,

Lin

P.S. So che sulla C ed operante programmazione livello di sistema, il valore di ritorno di una funzione filo è significativo solo per codice di uscita, e funzioni filo sarebbe un stretta funzione prototipo, ossia C funzioni devono rispettare alcune regole rigorose per diventare eseguibile come / un filo. E ora stiamo parlando di Python:)

È stato utile?

Soluzione

Da Stackless.com:

"... Ma devo ancora vedere un modo per recuperare il valore di ritorno della corsa callable legato come un tasklet. ..."

Non so che c'è uno.

"... importante valore di ritorno da utilizzare successivamente. Sembra che scrivere un tale funzione Micromanaging sul lato C non è molto fattibile, visto che non ho ..."

Il modo più semplice per farlo sarebbe quello di definire l'involucro Python codice funzione in C come una stringa, e compilarlo in un oggetto funzione che è possibile eseguire come tasklet. Una funzione di Python ad esempio segue, la parte C lascio a voi.

per es.

  def RunFunctionAndGetResult(chan, func, *args, **kwargs):
      chan.send(func(*args, **kwargs))

Saluti,

Richard.

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