Java中的Continuations

30

Java中有没有良好的实现continuations(续延)?

如果有的话,它的开销如何?JVM并不是为这种情况而设计的,对吧?那么这是否与常规相违背?


请参阅相关的https://dev59.com/FnE85IYBdhLWcg3wSxkv。 - Vadzim
11个回答

13

10
Javaflow http://commons.apache.org/sandbox/javaflow/ Play框架使用Javaflow http://blog.heroku.com/archives/2011/8/29/play/

RIFE http://www.artima.com/lejava/articles/continuations.html WebWork使用。

JauVM http://jauvm.blogspot.com/2005/07/so-what-does-it-do.html JVM中的JVM,实现尾递归/continuation

Scala 2.8 http://www.scala-lang.org/node/2096

Cocoon http://cocoon.apache.org/2.1/userdocs/flow/continuations.html http://wiki.apache.org/cocoon/RhinoWithContinuations

Jetty http://docs.codehaus.org/display/JETTY/Continuations 重试请求。

协程 http://code.google.com/p/coroutines

jconts https://github.com/idubrov/jconts

jyield http://code.google.com/p/jyield

Kilimhttp://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf 是一份关于Kilim框架的技术文献,该框架是基于Java虚拟机的,用于编写高效且可靠的并发应用程序。

ATCT http://portal.acm.org/ft_gateway.cfm?id=949362

是一篇针对ATCT算法的论文,该算法可以在保证正确性的同时,加速计算过程。

7

Jetty拥有续存支持。在DZone上有进一步的讨论和一些示例。

除了说Mortbay团队似乎总是注意这些问题之外,我无法对效率或其他方面提供建议。在Jetty网站上很可能会有有关实现折衷的讨论。


1
看起来Jetty的续订实现与其Servlet容器紧密相关,所以我认为这不能帮助我。 - Mike
3
Jetty的continuations并不是在编程语言意义上的真正continuations。它只是一个重新触发请求处理的技巧。 - gawi

3
自Java 8开始,现在有一个CompletableFuture<T>类,支持继续和更多的函数/反应式编程方法。
考虑以下示例,其中一个类提供了一个downloadAndResize方法:
public CompletableFuture<Image> downloadAndResize(String imageUrl, int width, int height) {
    return CompletableFuture
        .supplyAsync(() -> downloadImage(imageUrl))
        .thenApplyAsync(x -> resizeImage(x, width, height));
}

private Image downloadImage(String url){
    // TODO Download the image from the given url...
}

private Image resizeImage(Image source, int width, int height){
    // TODO Resize the image to w / h
}

上述方法的使用示例如下:
CompletableFuture<Image> imagePromise = downloadAndResize("http://some/url", 300, 200);

imagePromise.thenAccept(image -> {
    // Gets executed when the image task has successfully completed

    // do something with the image

});

1
这个问题涉及到continuations的实现。CompletableFuture只是其中一种很好的封装和使用方式。 - Vadzim

2
如果我理解正确,那么明显的问题就在于在闭包实例处于活动状态时如何解开堆栈。我认为一个具有词法作用域的语言理论上可以找出子帧可能创建闭包实例的情况,确定这些中间帧的引用,然后它可以malloc这些帧而不仅仅是将它们推入堆栈。
同样地,编译器可以malloc所有闭包引用非全局绑定对象的父帧或所有帧。
总结:
我认为JVM并没有比真实机器更限制闭包,只是因为它们与一般的堆栈范式相冲突,所以它们通常被推迟处理。

2

如果您不介意隐式连续性,Kilim是一个很好的选择。它通过处理注释方法并为您生成字节码中的连续来工作。显然,它做了更多的事情,因为它是一个框架,但如果您想要线程安全连续的(出色)性能,它值得一看。


1

1

最近出现了另一个强有力的竞争对手。

Quasar 使用 Matthias Mann 的 Java continuations 实现的分支,提供了更高级别的功能,如 轻量级线程、类似 Erlang 的 actors 和类似 Go 的协程和 通道

Quasar 博客 中有许多基准测试和详细介绍。

还有一个名为 Comsat 的即用型集成,旨在帮助轻松构建基于 continuations 机制的高性能 Web 服务。

Quasar还提供了一个漂亮的Kotlin API,最近在JetBrains的网络研讨会上得到了推荐。Quasar: Efficient and Elegant Fibers, Channels and Actors。所有提到的内容都是开源且免费使用的。另请参见http://blog.paralleluniverse.co/2015/08/07/scoped-continuations/

更新

Quasar的经验后来被用作Loom项目的基础,该项目旨在在Java 11之后的某个时候直接将continuations支持引入JVM。

它现在正在积极开发中,并已经有一个工作中的alpha 原型


1

0

这个概念验证库的分支被用于更加功能丰富和成熟的Quasar框架中。 - Vadzim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接