チャネルは通常の Python 参照を送信するため、送信するデータ (チャネル、文字列など) は正確に受信されます。
チャネルを介してチャネルを送信する 1 つの例は、タスクレットをサービスとして使用する場合です。つまり、タスクレットはチャネルで要求をリッスンし、動作し、結果を返します。リクエストには、結果がリクエスタに送られるように、作業のデータと結果のリターン チャネルを含める必要があります。
これは、数年前のPyCon での Stackless の講演のために開発した極端な例です。これにより、関数呼び出しごとに新しいタスクレットが作成されるため、Python のスタック制限を気にする必要のない再帰的な factorial の実装を使用できます。呼び出しごとにタスクレットを割り当て、結果のリターン チャネルを取得します。
import stackless
def call_wrapper(f, args, kwargs, result_ch):
result_ch.send(f(*args, **kwargs))
# ... should also catch and forward exceptions ...
def call(f, *args, **kwargs):
result_ch = stackless.channel()
stackless.tasklet(call_wrapper)(f, args, kwargs, result_ch)
return result_ch.receive()
def factorial(n):
if n <= 1:
return 1
return n * call(factorial, n-1)
print "5! =", factorial(5)
print "1000! / 998! =", factorial(1000)/factorial(998)
出力は次のとおりです。
5! = 120
1000! / 998! = 999000
私のプレゼンテーションでは、チャネルを介してチャネルを送信する例を他にもいくつか紹介しています。スタックレスではよくあることです。