通道发送正常的 Python 引用,因此您发送的数据(通道、字符串等)正是接收到的数据。
通过通道发送通道的一个示例是当您将小任务用作服务时,即小任务在通道上侦听请求,执行工作并返回结果。请求需要包含工作的数据和结果的返回通道,以便结果到达请求者。
这是我几年前在 PyCon 上为 Stackless 演讲开发的一个极端示例。这会为每个函数调用创建一个新的 tasklet,因此我可以使用阶乘的递归实现,而无需担心 Python 的堆栈限制。我为每个调用分配一个 tasklet,它获取结果的返回通道。
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
在我的演示文稿中,我还有其他一些通过频道发送频道的示例。这在 Stackless 中很常见。