Question

Stackless experts,

J'ai réussi à créer tasklets sous Stackless Python (les deux de la Stackless et du côté C).

Il me semble que, pour créer un tasklet dans Stackless, vous liez un Python appelable arbitraire (fonction) au tasklet (ainsi que les paramètres requis), de sorte que le appelable lié serait exécuté en tant que tasklet. Cependant, un appelable arbitraire pourrait effectivement avoir une valeur de retour qui est important pour l'appelant. Mais je dois encore voir un moyen de récupérer la valeur de retour de la course appelable liée comme tasklet.

Du côté pur Stackless Python, je ne vois un idiome d'utilisation appelé Microgestion, qui enveloppe la fonction d'origine avec une fonction de gestion, qui à son tour pourrait saisir la valeur de retour de la fonction d'origine et sauver quelque part pour une utilisation dans un autre contexte.

Malheureusement, mon cas particulier d'utilisation implique la création d'un tasklet du C (C ++) côté, la liaison à un (potentiellement bloquer) Python appelable qui a une valeur de retour importante à utiliser plus tard. Il semble que l'écriture d'une telle fonction microgestion du côté C est pas très faisable, puisque je ne l'ai pas trouvé un moyen de transformer une fonction C dans une dynamique appelable PyObject (ne comportant pas l'initialisation de la table des modules, etc.), et l'utilisation sans état statique fonction C (je suppose le prototype doit être PyObject * (* PyObject, PyObject *)) est généralement une mauvaise idée dans le monde de C de toute façon.

L'API Stackless C semble également ne contenant pas une fonction appropriée pour récupérer la valeur de retour d'un tasklet. Est-ce la seule option que je dois écrire ci-dessus mentionné la fonction Microgestion ( peut être stateful) en Python, et fournir un moyen de récupérer la valeur de retour quelque part enregistré (de façon stateful, ce n'utilise pas globale variables)? Ou il pourrait y avoir d'autres options que je pourrais peut-être explorer?

Merci beaucoup,

Lin

P.S. Je comprends que sur le C et la programmation au niveau du système d'exploitation, la valeur de retour d'une fonction de thread est significatif que pour le code de sortie, et les fonctions de fil serait un prototype de fonction stricte, les fonctions-à-dire C doivent respecter des règles strictes pour devenir runnable comme / par un fil. Et maintenant, nous parlons de Python:)

Était-ce utile?

La solution

De Stackless.com:

« ... Mais je dois encore voir un moyen de récupérer la valeur de retour de la course appelable liée comme tasklet. ... »

Je ne sais pas qu'il y en a un.

« ... une importante valeur de retour à utiliser plus tard. Il semble que l'écriture d'une telle fonction microgestion du côté C est pas très faisable, puisque je ne ... »

La façon la plus simple de le faire serait de définir l'emballage code de fonction Python en C sous forme de chaîne, et de le compiler dans un objet de fonction que vous pouvez exécuter en tant tasklet. Un exemple fonction Python suit, la partie C je vous laisse.

par exemple.

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

Cheers,

Richard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top