相关疑难解决方法(0)

什么是Scala延续以及为什么要使用它们?

我刚刚完成了Scala编程,我一直在研究Scala 2.7和2.8之间的变化.似乎最重要的一个是continuation插件,但我不明白它对它有用或它是如何工作的.我已经看到它对异步I/O很有用,但我还是找不到原因.关于这个主题的一些更受欢迎的资源是:

关于Stack Overflow的这个问题:

不幸的是,这些引用中没有一个试图定义什么是continuation或者shift/reset函数应该做什么,而且我没有找到任何引用.我无法猜测链接文章中的任何示例是如何工作的(或者他们做了什么),因此帮助我的一种方法可能是逐行浏览其中一个示例.即使是第三篇文章中的简单文章:

reset {
    ...
    shift { k: (Int=>Int) =>  // The continuation k will be the '_ + 1' below.
        k(7)
    } + 1
}
// Result: 8
Run Code Online (Sandbox Code Playgroud)

为什么结果是8?这可能会帮助我开始.

continuations scala scala-2.8 delimited-continuations

84
推荐指数
5
解决办法
2万
查看次数

Kotlin中线程和协程之间的区别

Kotlin中是否有任何特定的语言实现,它与协同程序的另一种语言实现有所区别?

  • coroutine就像轻量级线程一样意味着什么?
  • 有什么不同?
  • kotlin协程实际上并行/同时运行吗?
  • 即使在多核系统中,在任何给定时间只有一个协程运行(是不是?)

在这里,我将启动100000个协程,这段代码背后会发生什么?

for(i in 0..100000){
   async(CommonPool){
    //run long running operations
  }
}
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines

55
推荐指数
2
解决办法
1万
查看次数

在没有JVM支持的情况下,如何在JVM语言中实现协同程序?

在阅读了Loom提案之后提出了这个问题,该提案描述了在Java编程语言中实现协同程序的方法.

特别是此提案表示,要在该语言中实现此功能,将需要额外的JVM支持.

据我所知,JVM上已经有多种语言可以将协同程序作为其功能集的一部分,例如Kotlin和Scala.

那么如何在没有额外支持的情况下实现此功能,如果没有它可以有效实施?

java jvm scala jvm-languages kotlin

50
推荐指数
2
解决办法
2528
查看次数

Java中可用的协程库

我想用Java做一些事情,如果使用并发例程编写会更清楚,但是对于哪些完全线程严重过度杀伤.当然,答案是使用协同程序,但标准Java库中似乎没有任何协程支持,而快速谷歌在这里或那里会带来诱人的提示,但没有什么实质性的.

这是我到目前为止所发现的:

  • JSIM有一个协程类,但它看起来非常重量级,并且看起来与点上的线程混淆.这样做的目的是降低全面线程的复杂性,而不是添加它.此外,我不确定该类是否可以从库中提取并独立使用.
  • Xalan有一个coroutine set类,可以执行类似coroutine的东西,但是如果可以从整个库中有意义地提取它,那么它仍然是可疑的.它看起来像是一个严格控制的线程池形式,而不是实际的协同程序.
  • 有一个谷歌代码项目看起来像我所追求的,但如果有什么它看起来比使用线程更重量级.我基本上对需要软件在运行时动态更改JVM字节码以完成其工作的事情感到紧张.这看起来有点矫枉过正,并且会像协同程序解决的那样导致更多问题.此外,它似乎没有实现整个协程概念.通过我的一瞥,它提供了一个yield只返回调用者的功能.正确的协同程序允许yields将控制权直接转移到任何已知的协程.基本上这个库,重量级和可怕的,只给你支持迭代器,而不是完全通用的协同程序.
  • 有希望命名的Coroutine for Java失败了,因为它是一个特定于平台(显然使用JNI)的解决方案.

这就是我发现的一切.

我知道Da Vinci机器中对协同程序的本机JVM支持,我也知道这样做的JNI延续技巧.然而,对我来说这些并不是一个很好的解决方案,因为我不一定能控制我的代码运行在哪个VM或平台上.(事实上​​,任何字节码操作系统都会遇到类似的问题 - 如果可能的话,最好是纯Java.运行时字节码操作会限制我在Android上使用它.例如.)

那么有人有任何指针吗?这甚至可能吗?如果没有,是否可以在Java 7中使用?


编辑添加:

只是为了确保混乱载,这是一个相关的问题我的另外一个,但又不尽相同.这个是寻找现有的实施方案,以避免不必要地重新发明轮子.另一个是关于如何在Java中实现协同程序的问题,如果这个问题无法解决的话.目的是在不同的线程上保留不同的问题.


进一步编辑添加:

答案被选中.然而,有些评论是有条理的.库指向的不是一个协程库,所以它在技术上不回答我的问题.尽管如此,它与上面链接的Google Code项目有两个优势:

  1. 两种解决方案都使用字节码操作,但所选的库允许静态字节码操作,这使得它可以在Android和其他不兼容的JVM堆栈中使用.
  2. Google Code项目不会执行完整协同程序.虽然答案的库甚至根本不做协同程序,但它确实做了一些更重要的事情:它为滚动我自己的全功能协程提供了一个很好的基础工具.

java coroutine

42
推荐指数
4
解决办法
1万
查看次数

Java调用栈检查和操作

我的问题是:是否有可能(以任何方式)在运行时分析和修改调用堆栈(帧内容和堆栈内容)?

我正在寻找任何可能性 - 低级,不安全或内部API,编写C扩展的可能性等.只有约束:它应该可以在标准运行时使用,无需调试或分析模式.这就是我正在研究"它有可能吗?",而不是"这是好主意吗?".

我想从一个框架中收集所有本地数据,将其存储在某个地方,然后从堆栈中删除该框架,以后可以恢复它.实际上,它为我们提供了JVM的延续,它们将允许快速异步框架(如来自python的gevents)和生成器结构(如python中的那些).

这可能看起来像重复的问题,但我只发现了用"使用Thread.currentThread().getStackTrace()"或"应该用调试工具完成"的问题.我有类似的问题,但它只是在询问人们想要做什么(处理异步计算)的背景下回答,而我需要更一般的(面向Java堆栈)答案.这个问题也是类似的,但和以前一样,它专注于并行化,答案也集中于此.

我再说一遍:这是提出新语言功能提案的研究步骤.我不想冒险破坏JVM中的任何东西 - 我正在寻找可能性,然后我将分析可能的风险并留意它们.我知道手工操作堆栈是丑陋的,但是通过省略的consrtuctor创建实例也是如此 - 它是客观化的基础.肮脏的黑客可能很脏,但它们可能有助于引入一些很酷的东西.

PS.我知道QuasarLightwolf存在,但是,如上所述,那些是以并发为中心的框架.

编辑

澄清一点:我正在寻找与未来JVM和库版本兼容的东西.我们最好谈论一些被认为是稳定的公共API的东西,但如果解决方案存在于内部,但几乎是标准的,或者在内部(如sun.misc.Unsafe)之后成为标准的东西 - 这也会做.如果C-extension只使用C JVM API可行 - 那没关系.如果这对于字节码操作是可行的 - 那也没关系(我认为可以使用ASM).

java jvm stack-trace

16
推荐指数
1
解决办法
1416
查看次数

Java中的延续

我正在寻找最近的工作,展示Java的延续.我在这里遇到过同样的问题,但可以追溯到一两年.

有一些工作,如Apache的JavaFlow,RIFE Con​​tinuations(我现在无法出于任何原因下载).还有一篇博客文章提到了JDK中的支持,但似乎支持将延伸到Java 8.我还认为最近的 Scala版本中也引入了延续.

我正在寻找Java中的实现,提出了continuation概念.并且,我不是在寻找具有延续传递风格(CSP)的作品.

我要感谢你可能知道的任何其他工作.

java continuations

9
推荐指数
1
解决办法
2536
查看次数

Play's continuations holding http threads

We have implemented a feature in our web app that updates the GUI in response to new events in the server by using Play's continuations, just like a chat app. After running it for some time in production we started to experience server hangs, more specifically the http connector of our Glassfish server stopped accepting new requests. A thread dump shows us that all http threads from the http thread pool are waiting for Play Promises to be invoked. Our …

java continuations web-applications glassfish playframework

7
推荐指数
1
解决办法
1207
查看次数

如何通过反射运行挂起方法?

有一个可以运行挂起功能的协程块.

但是我invoke通过反射来调用函数.这是java风格的调用,显然简单的调用是行不通的.有没有办法异步运行反射方法?如何等待这种方法?

import kotlin.coroutines.experimental.*

class TestClass(val InString: String) {
    suspend fun printString() {
        println(InString)
    }
}

fun launch(context: CoroutineContext, block: suspend () -> Unit) =
        block.startCoroutine(StandaloneCoroutine(context))

private class StandaloneCoroutine(override val context: CoroutineContext): Continuation<Unit> {
    override fun resume(value: Unit) {}

    override fun resumeWithException(exception: Throwable) {
        val currentThread = Thread.currentThread()
        currentThread.uncaughtExceptionHandler.uncaughtException(currentThread, exception)
    }
}

fun main(args: Array<String>) {
    launch(EmptyCoroutineContext) {
        val a = TestClass("TestString");

        for (method in a.javaClass.methods) {
            if (method.name == "printString")
                method.invoke(a)  // Exception in thread "main" java.lang.IllegalArgumentException: …
Run Code Online (Sandbox Code Playgroud)

java coroutine async-await kotlin kotlin-coroutines

2
推荐指数
1
解决办法
847
查看次数