スタックレスPythonタスクレットバウンド関数の返品値を取得しますか?

StackOverflow https://stackoverflow.com/questions/3092614

質問

スタックレスの専門家、

Stackless Python(StacklessとC側の両方)の下にタスクレットを作成することができました。

Stacklessでタスクレットを作成するために、任意のPythonをタスクレット(および必要なパラメーター)に呼び出すことができるように結合するため、バウンドコール可能な呼び出しがタスクレットとして実行されます。ただし、任意の呼び出し可能な人は、実際には発信者にとって重要な返品値がある場合があります。しかし、私はまだタスクレットとして実行可能なバウンドコール可能なランニングの返品値を取得する方法を見ていません。

Pure Stackless Python側には、MicroManagingと呼ばれる使用法が表示されます。 たぶん......だろう 元の関数の返品値をキャプチャし、他のコンテキストで使用するためにどこかに保存します。

残念ながら、私の特別なユースケースでは、C(C ++)側からタスクレットを作成し、後で使用する重要なリターン値を持つ(潜在的にブロック)Pythonコール可能に結合することが含まれます。 C側にそのようなマイクロ管理関数を書くことは、C関数を動的に呼び出すPyObjectに変換する方法(モジュールテーブルの初期化などを含む)に変える方法を見つけていないため、静的なステートレスを使用する方法を見つけていないため、あまり実現できないようです。 c関数(プロトタイプはpyobject*(pyobject*、pyobject*)であると仮定します)は、とにかくC ++の世界では悪い考えです。

スタックレスC APIは、タスクレットの返品値を取得するための適切な関数も含まれていないようです。上記のマイクロ管理関数を書かなければならない唯一のオプションですか(たぶん......だろう Pythonでステートフルになり、どこかに保存されたリターン値を取得する方法を提供します(ステートフルな方法で、つまりグローバル変数を使用していません)?または、私が探求できる他のオプションがあるかもしれませんか?

どうもありがとうございます、

リン

PS Cおよびオペレーティングシステムレベルのプログラミングでは、スレッド関数の返品値はExitコードにとってのみ意味があり、スレッド関数には厳密な関数プロトタイプがあります。 as/by sweth。そして今、私たちはPythonについて話している:)

役に立ちましたか?

解決

Stackless.comから:

「...しかし、私はまだタスクレットとして実行可能なバウンドコール可能なリターン値を取得する方法をまだ見ていません。」

私はそれがあることを知りません。

「...後で使用する重要な返品値。C側にそのようなマイクロ管理関数を書くことは、私がいないので、あまり実現できないようです...」

これを行う最も簡単な方法は、cのラッピングPython関数コードを文字列として定義し、タスクレットとして実行できる関数オブジェクトにコンパイルすることです。 Python関数の例が続きます。私はあなたに去るC部品です。

例えば

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

乾杯、

リチャード。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top