Java中是否有一个很好的延续实现?
如果是这样,开销是什么样的?JVM 在设计时并没有考虑到这些事情,对吧?那么这种做法是不是逆天了呢?
请参阅 Apache Javaflow http://commons.apache.org/sandbox/javaflow/
它是唯一一个正在积极开发的 Java 延续包。另一个,RIFE,我不确定它在哪个州。
Javaflow http://commons.apache.org/sandbox/javaflow/ 播放框架使用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,实现尾调用/延续
斯卡拉 2.8 http://www.scala-lang.org/node/2096
茧 http://cocoon.apache.org/2.1/userdocs/flow/continuations.html http://wiki.apache.org/cocoon/RhinoWithContinuations
码头 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
基林 http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf
从 Java 8 开始,现在有一个CompletableFuture<T>
类支持延续和更多的函数式/反应式编程方法。
考虑以下示例,其中 Class 提供了一个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
});
如果我理解正确,我认为明显的问题涉及在关闭实例处于活动状态的情况下展开堆栈。我想一种具有词法范围的语言理论上可以计算出一个子框架可以创建一个闭包实例,识别那些被引用的中间框架,然后它可以分配这些框架而不是仅仅将它们推入堆栈。
为此,编译器可以分配引用非全局绑定对象的闭包的所有帧或所有父帧。
我认为 JVM 对闭包的限制并不比真正的机器多,只是它们与一般的堆栈范式作斗争,因此它们通常会受到打击。
如果您不介意隐式延续,Kilim是一个不错的选择。它通过处理带注释的方法并为您生成字节码中的延续来工作。显然,由于它是一个框架,它的功能要多得多,但是如果您想要线程安全延续的(出色)性能,那么值得一看。
玩!框架版本 1.2.x 还支持与异步 http 好东西集成的延续。
最近又出现了一个强大的竞争对手。
Quasar使用来自 Matthias Mann 的 java continuation实现的fork来提供更高级别的功能,例如轻量级线程、类似 Erlang 的演员和类似 Go 的协程和通道。
Quasar 博客中有很多基准测试和详细介绍。
还有一个名为Comsat的即用型集成,旨在帮助轻松构建基于引擎盖下的延续机制的高性能 Web 服务。
Quasar 还提供了一个不错的 Kotlin API,该 API 在最近的 JetBrains 网络研讨会 Quasar:Efficient and Elegant Fibers, Channels and Actors中得到了展示。
提到的所有内容都是开源的并且可以免费使用。
另见http://blog.paralleluniverse.co/2015/08/07/scoped-continuations/
更新
Quasar 的经验后来被用作Loom 项目的基础,该项目旨在在 Java 11 之后的某个时间将延续支持直接引入 JVM。
Matthias Mann 的另一个图书馆:
Scala也在 JVM 上运行。所以它可能是相关的。
此外,Scala 有一些类似的 async/await 特性: