Frage

Stackless Experten,

Ich habe es geschafft Tasklets unter Stackless Python (beide aus dem Stackless und der C-Seite) zu erstellen.

Es scheint mir, dass, um eine Tasklet in Stackless, Sie zu erstellen binden eine beliebige Python aufrufbar (Funktion) zum Tasklet (sowie die erforderlichen Parameter), so das gebundene aufrufbar würde als Tasklet ausgeführt werden. Allerdings könnte eine beliebige aufrufbar tatsächlich einen Rückgabewert, der den Anrufer wichtig ist. Aber ich habe noch einen Weg, um zu sehen, den Rückgabewert des gebundenen aufrufbar Laufes als Tasklet abgerufen werden.

Auf der reinen Stackless Python Seite, mache ich eine Nutzung Idiom sehen Micromanaging genannt, die die ursprüngliche Funktion mit einer Verwaltungsfunktion Wraps, die wiederum könnte erfassen den Rückgabewert der ursprünglichen Funktion und speichern es irgendwo für die Verwendung in einem anderen Kontext.

Leider ist mein besonderer Anwendungsfall beinhaltet eine Tasklet aus der C-Erstellung (C ++) Seite, die Bindung an einen (möglicherweise blockieren) Python aufrufbar, die eine wichtige Rückgabewert muss höher verwendet werden. Es scheint, dass auf der C-Seite ein solches Mikromanagement-Funktion Schreiben nicht sehr machbar ist, da ich nicht einen Weg zu drehen eine C-Funktion in eine PyObject aufrufbar dynamisch (nicht beteiligt Modultabelle Initialisierung, etc.), und unter Verwendung eines statischen staatenlos gefunden C-Funktion (ich würde davon ausgehen, der Prototyp hat PyObject * (PyObject *, PyObject *) sein) sowieso ist generell eine schlechte Idee unter C ++ Welt.

Die Stackless C-API scheint auch keine richtige Funktion mit dem Rückgabewert einer Tasklet abzurufen. Ist es die einzige Möglichkeit, dass ich zu schreiben oben genannten Micromanaging Funktion habe ( könnte sein Stateful) in Python, und bietet eine Möglichkeit, den Rückgabewert gespeichert irgendwo (in einer Stateful Art und Weise abzurufen, indem das heißt nicht global Variablen)? Oder es könnte auch andere Optionen, die ich vielleicht entdecken könnte?

Vielen Dank,

Lin

P. S. Ich verstehe, dass auf der C und Betriebssystem-Level-Programmierung ist der Rückgabewert einer Thread-Funktion nur dann sinnvoll für Exit-Code, und Thread-Funktionen würden einen strikten Funktionsprototyp, dh C-Funktionen von einigen strengen Regeln halten müssen, werden runnable als / von einem Thread. Und jetzt sprechen wir über Python:)

War es hilfreich?

Lösung

Von Stackless.com:

„... Aber ich habe noch einen Weg, um zu sehen, den Rückgabewert des gebundenen aufrufbar Laufes als Tasklet abgerufen werden. ...“

Ich weiß nicht, dass es einen gibt.

„... wichtig Rückgabewert höher verwendet werden. Es scheint, dass auf der C-Seite ein solches Mikromanagement-Funktion Schreiben nicht sehr machbar ist, da ich nicht ...“

Der einfachste Weg, dies zu tun wäre, die Verpackung Python Funktionscode in C als String zu definieren, und es in ein Funktionsobjekt zu kompilieren, dass Sie als Tasklet ausführen können. Ein Beispiel Python Funktion folgt, die C Teil I, dich zu verlassen.

z.

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

Cheers,

Richard.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top