1

我正在尝试一个简单的 akka 数据流示例,如下所示:

import akka.dataflow._ //to get the flow method and implicit conversions

object FlowTestApp extends App {
    import scala.concurrent.ExecutionContext.Implicits.global

    flow { 
      println("in flow")
      "Hello world!" 
    } onComplete println
}

我还在 scala 编译器设置的 P 字段中设置了 continuations:enable。但是运行程序后,我在控制台中什么也没有,没有错误,也没有“你好,世界”。我错过了什么?

4

1 回答 1

3
import akka.dataflow._
import scala.concurrent._, ExecutionContext.Implicits._

// the following are for duration
import scala.language.postfixOps
import scala.concurrent.duration._

object FlowTestApp extends App {

  val f = flow {
    println("in flow")
    "Hello world!"
  } onComplete println

  Await.ready(f, 1 second)
}

如果您正在考虑使用 Akka Dataflow 作为线程的非阻塞替代方案,这是我的 2 美分:

一些核心语言特性(例如循环、try/finally)在分隔的代码块中中断。我一直在使用它进行一些 I/O,我对它很满意,但我会确保将其保留在引擎盖下。

akka-dataflow 的 %99 是 Scala 的 continuation 插件。flow()的定义(这让我大吃一惊)和拉皮条的 Future#apply() 确实是所需要的,而且它们非常小。然而,Scala 的 continuation 插件比非阻塞线程的问题更通用。

对于替代解决方案,请跟踪scala-async,它具有更具体的方法(将看似顺序的代码转换为future { ... } flatMap { ... }块)

我上周尝试过,到那时 scala-async 的代码转换仍然比 akka-dataflow 支持的要少,但是从提交日志来看,它似乎正在快速增长并且很快就会超过它。

于 2013-04-16T21:08:25.643 回答