スタックレスエキスパート、
Stackless Python でタスクレットを作成することができました (Stackless 側と C 側の両方から)。
スタックレスでタスクレットを作成するには、任意の Python 呼び出し可能オブジェクト (関数) をタスクレット (および必要なパラメーター) にバインドすると、バインドされた呼び出し可能オブジェクトがタスクレットとして実行されるように思えます。ただし、任意の callable には、実際には呼び出し元にとって重要な戻り値がある場合があります。しかし、タスクレットとして実行されているバインドされた callable の戻り値を取得する方法はまだ見ていません。
純粋な Stackless Python 側では、Micromanaging と呼ばれる使用法を目にします。これは、元の関数を管理関数でラップし、元の関数の戻り値をキャプチャして、他のコンテキストで使用するためにどこかに保存することができます。
残念ながら、私の特別な使用例では、C (C++) 側からタスクレットを作成し、後で使用する重要な戻り値を持つ (ブロックする可能性がある) Python 呼び出し可能オブジェクトにバインドします。C関数を動的に呼び出し可能なPyObjectに変換する方法(モジュールテーブルの初期化などを含まない)を見つけられず、静的ステートレスC 関数 (プロトタイプは PyObject* (PyObject*, PyObject*) でなければならないと思います) は一般的に、C++ の世界ではまずい考えです。
また、Stackless C API には、タスクレットの戻り値を取得するための適切な関数が含まれていないようです。上記の Micromanaging 関数 (ステートフルである可能性があります) を Python で記述し、どこかに保存された戻り値を取得する方法を (ステートフルな方法で、つまりグローバル変数を使用しないで) 提供する唯一のオプションですか? または、私が検討できる他のオプションがあるのでしょうか?
どうもありがとうございました、
リン
PS Cおよびオペレーティングシステムレベルのプログラミングでは、スレッド関数の戻り値は終了コードに対してのみ意味があり、スレッド関数には厳密な関数プロトタイプがあることを理解しています。つまり、C関数は実行可能になるためにいくつかの厳密な規則に従わなければなりませんスレッドとして/によって。そして今、私たちはPythonについて話している:)