浏览 2290 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-08
http://www-128.ibm.com/developerworks/cn/opensource/os-lightweight9/ http://www.iteye.com/post/168845 翻译的晦涩难懂,多多关照 ============================================================= 延续(Continuations ) 延续(Continuations )是一个很强大的流程控制机制。一个延续(Continuation)表现为一个特定的调用栈和词 法变量状态。他是在执行Ruby代码一个点上的快照。不幸的是,Ruby1.8对延续(Continuations )的实现非常的 慢,造成了对很多应用不可用。Ruby 1.9 的虚拟机可能会改进这个情况,但是不要期望在Ruby1.8上得到延续 (Continuations )的比较好的性能。但是,这个是很有用的组成部分,并且基于延续(continuation-based)的 web框架提供了一个在像Rails框架很有趣的选择。 延续(Continuations)强大的几个原因: 延续(Continuations)仅仅是一个对象;可以在函数间传递。 延续(Continuations)可以在任何地方调用。如果有一个延续(Continuations)的引用,就可以调用。 延续(Continuations)可以再参与。可以用延续(Continuations)在一个函数里返回多次。 延续(Continuations)通常被认为“structured GOTO”。本身,它被作为在同一个情况下任何GOTO construct。延 续(Continuations)非常的少或者不会在一个应用内部代码;它通常应该被封装在库里面。 I don't say this because I think developers should be protected from themselves. 或者,相比直接使用延续 (continuations), 把他们提取出来更容易理解。这种思想就是程序员在构建软件应用时应该考虑到"external iterator"或者 "coroutine" (both abstractions built on top of continuations) 而不是延续 ("continuation")。 Seaside是Smalltalk的一个基于Continuations的web应用框架。Continuations在Seaside里用作管理会话(色素 sion)状态。每一个用户会话相当于一个服务器段的Continuation。当请求进入时,Continuation会被调用、更多 的代码被执行。这个结果让整个事务可以作为一个代码流,即使他跨过多个HTTP请求。这个能力来自于Smalltalk 的延续是连续的事实;他可以在一个数据库或者文件系统编码,然后溶解并根据请求调用。Ruby的延续不是顺序 的。在Ruby里,延续是只在内存里并且不能转变成字节流。 Borge是一个简单Seaside 2到Ruby移植。Seaside和Borges的主要区别是Borges必须存储当前的延续在内存里,因为他们不是连续的。这是一个很大的限制,他阻止了Borges在任何程度上成为一个很好的web应用。如果连续的延续在Ruby实现,即不会有这个限制了。 在下面Borges很明显的指出了延续的强大,这个例子提供一个在线商店的物品列表: class SushiNet::StoreItemList < Borges::Component def choose(item) call SushiNet::StoreItemView.new(item) end def initialize(items) @batcher = Borges::BatchedList.new items, 8 end def render_content_on(r) r.list_do @batcher.batch do |item| r.anchor item.title do choose item end end r.render @batcher end end # class SushiNet::StoreItemList 大部分的功能出现在render_content_on里,它用了一个BatchedList去提供分页的连接到产品的列表。但是有趣的是在调用anchor,一个储存了对choose的调用,在相应的连接被点击的时候才执行了。 当然,在web编程的延续上还是有很多分歧。HTTP在设计的时候就是无状态的协议,对于web事务的延续恰好是相反的。所有的延续必须储存在服务器上,这将占用额外的内存和硬盘空间。因此必须处理会话,把用户的流量定向到同一个服务器。结果就是,如果一个server当机,他的所有的session就丢失了。比较流行的Seaside的应用——DabbleDB,很少使用了延续。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-09
真是惭愧,完全看不明白.
|
|
返回顶楼 | |
发表时间:2008-06-09
同感,貌似是翻译的原因,如果真的是,请给出原始连接的URI
|
|
返回顶楼 | |
发表时间:2008-06-09
题目上有,是Oreilly 的 Advanced Rails中的一节,翻译不好,多多包涵
可以参考以下: http://www.iteye.com/post/168845 |
|
返回顶楼 | |