我没有 stackless 目前正在运行,所以我不能试试这个我自己。

import stackless
ch1 = stackless.channel()
ch2 = stackless.channel()

ch1.send(ch2)
ch3 = ch1.receive()

ch2ch3 然后相同的频道吗?说:

text = "Hallo"
ch2.send(text)
assert text == ch3.receive()

这一功能提醒我一个 谈做newsqueak 罗伯特*派克(的 Plan9 名)给在谷歌。在做newsqueak你可以发送渠道的渠道。

有帮助吗?

解决方案

是。只是测试

>>> import stackless
>>> ch1 = stackless.channel()
>>> def a():
...  ch2 = stackless.channel()
...  ch1.send(ch2)
...  ch2.send("Hello")
...
>>> def b():
...  ch3 = ch1.receive()
...  print ch3.receive()
...
>>> stackless.tasklet(a)()
<stackless.tasklet object at 0x01C6FCB0>
>>> stackless.tasklet(b)()
<stackless.tasklet object at 0x01C6FAB0>
>>> stackless.run()
Hello

其他提示

频道所以数据发送(信道,串,等等)是在接收正是发送普通的Python引用。

发送通过信道的信道的一个例子是当使用一个tasklet作为服务,即,一个tasklet侦听请求的信道的,不工作,并返回结果。该请求需要包含的工作和结果的返回信道的数据,使得结果进到请求者。

下面是我为我的在PYCON Stackless的谈话的开发,几年前一个极端的例子。这会为每个函数调用,所以我可以用递归实现阶乘,并不需要担心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

我在我的介绍在发送信道的信道的一些其它示例。这是在无堆栈常见的事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top