首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在无堆栈的Python中,您能通过一个通道发送一个通道吗?

在无堆栈的Python中,您能通过一个通道发送一个通道吗?
EN

Stack Overflow用户
提问于 2009-03-12 12:46:57
回答 2查看 660关注 0票数 4

我目前没有无堆栈运行,所以我不能亲自尝试。

代码语言:javascript
复制
import stackless
ch1 = stackless.channel()
ch2 = stackless.channel()

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

ch2和ch3是同一个频道吗?可以这样说:

代码语言:javascript
复制
text = "Hallo"
ch2.send(text)
assert text == ch3.receive()

这个特性让我想起了罗伯特·派克( Robert )在谷歌( Plan9 )上给我的一个Plan9。在Newsqueak,你可以通过频道发送频道。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-12 14:26:27

是。刚刚测试过。

代码语言:javascript
复制
>>> 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
票数 4
EN

Stack Overflow用户

发布于 2009-03-12 17:05:14

通道发送普通的Python引用,因此您发送的数据(通道、字符串等)正是所接收的。

在通道上发送通道的一个例子是当您将tasklet用作服务时,也就是说,tasklet侦听通道上的请求,执行工作,并返回结果。请求需要包含工作的数据和结果的返回通道,以便将结果发送给请求者。

下面是我几年前为我的在PyCon上无堆栈的谈话开发的一个极端示例。这将为每个函数调用创建一个新的tasklet,这样我就可以使用阶乘的递归实现,而不需要担心Python的堆栈限制。我为每个调用分配一个tasklet,并为结果获取返回通道。

代码语言:javascript
复制
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)

产出如下:

代码语言:javascript
复制
5! = 120 
1000! / 998! = 999000

在我的演讲中,我还有其他几个通过渠道发送频道的例子。在无堆栈环境下这是很常见的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/638464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档