Board logo

标题: 延续、Web 开发和 Java 编程(2) [打印本页]

作者: look_w    时间: 2018-7-16 12:28     标题: 延续、Web 开发和 Java 编程(2)

老问题的新答案在 Web 开发中,可以利用有状态模型为用户提供无状态体验。您听到这种说法可能会感到震惊。实际上,在 Hackers and Painters(参见 )中,Paul Graham 就讨论了早在 1995 年在 ViaWeb 中使用的底层方法。这种方法使用一种称为延续(continuation) 的编程控制结构。
基本思想是:可以让编程框架在请求之前装载应用程序的状态,并在每个请求之后保存应用程序的状态。我首先介绍一下 Ruby 编程语言中的延续。
一个 Ruby 示例如果希望执行代码,请安装 Ruby 并输入 irb。通过在 > 字符后面输入命令,定义一个称为 loop 的方法,见清单 1:
清单 1. 创建 loop 方法
1
2
3
4
5
6
7
irb(main):001:0> def loop(interrupt)
irb(main):002:1> for i in 1..10
irb(main):003:2> puts "Value of i: #{i}"
irb(main):004:2> callcc {|c| return c} if i == interrupt
irb(main):005:2> end
irb(main):006:1> end
=> nil




loop 方法接受一个称为 interrupt 的参数。它启动一个从 1 到 i 的 for 循环,打印 i 的值,然后做一些奇怪的事儿。神秘的 callcc 语句意味着用延续进行调用。可以把延续看成在某一时间点上 “冻结的” 程序状态。Ruby 调用花括号中的代码块,同时传递一个延续对象。花括号中的代码是一个闭包,它仅仅是传递给 callcc 的代码块。最终结果是,callcc 捕获执行的状态并将结果存储在 c 中。现在,可以调用这个方法并在循环的任意位置中断执行,这会捕获程序的状态。在以后,可以恢复状态。
现在,执行这个方法两次,见清单 2:
清单 2. 执行 loop 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
irb(main):007:0> cont = loop 5
Value of i: 1
Value of i: 2
Value of i: 3
Value of i: 4
Value of i: 5
=> #<Continuation:0x2b5a358>
irb(main):008:0> cont.call
Value of i: 6
Value of i: 7
Value of i: 8
Value of i: 9
Value of i: 10
=> 1  10
irb(main):009:0> cont = loop 8
Value of i: 1
Value of i: 2
Value of i: 3
Value of i: 4
Value of i: 5
Value of i: 6
Value of i: 7
Value of i: 8
=> #<Continuation:0x2b562f0>
irb(main):010:0> cont.call
Value of i: 9
Value of i: 10




每次执行调用时,延续会获得执行的状态。所以,使用延续的 Web 开发框架可以在处理每个请求之后捕获一个延续,并用一个标识符将它存储在会话中。然后,框架可以在处理每个新请求之前从会话中恢复延续,采用的方法与存储用户数据一样。
优点和缺点延续服务器方式在许多方面都很出色 —— 有状态的编程模型和具有无状态性能的用户体验。这种方式的优点如下:
延续大大简化了 Web 开发模型。有了延续,就可以将 Web 应用程序看成具有一系列请求的应用程序,能够提供更多的用户信息。图 2 给出了修改后的应用程序流。在用户启动应用程序之后,Web 服务器处于控制之中。应用程序不再是应付以任意次序到达的任意请求,而是变成了与一个用户进行统一且直接的交谈。
图 2. 延续支持更自然的应用程序流与许多高阶抽象相似,延续也有缺点。这些缺点将影响依赖于延续的整体方式。延续服务器必须解决下面这些常见问题:
总的来说,我相信延续代表着一种重大的技术进步,在不久的将来您可能会看到流行的延续服务器实现。现在我们来看看其他语言中的某些实现,然后我展示一些具体的细节。
其他语言中的实现有好几种语言都具有基于延续的方法(参见  中的链接以了解关于它们的更多信息)。最常见的实现是用 Lisp、Ruby 和 Smalltalk 编写的。
还有一些没有在这里列出的延续服务器。目前,大多数延续服务器实现是用支持延续的语言编写的,而这些语言不是主流语言。但是,以后的情况可能会不一样。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0