我总是有时间了解延续的某个方面。我理解基本概念 - 你可以调用一个继续来将控制转移到你保存连续的地方。
对于简单的例子,比如REPL语句,这看起来很简单(使用Scheme作为例子):
(+ 5 (call-with-current-continuation
(lambda (k) (+ 45 (k 4)))))
将返回9,因为(+ 45 __)
计算简单地丢失并且调用k"插入" 4进入(+ 5 _)
。
但是,延续通常用于更复杂的项目,尤其是Web应用程序服务器。在此特定上下文中,我们假设您在处理用户请求时保存了延续c
。然后,Web服务器继续处理下一个请求,直到控制权传递回c
。
但是在调用c
之后,创建时c
的整个堆栈将重新存在。一旦特定的请求处理程序完成后会发生什么?控制只是返回到应用程序的主请求处理部分吗?
例如,假设外部循环正在处理来自客户端的请求缓冲区。如果我们在处理其中一个请求时保存延续,然后在缓冲区完全处理后调用该延续,则不会导致控制和堆栈返回到处理该请求的点,从而导致请求被处理多次?