【问题标题】:Failed A akka dataflow sample失败 Akka 数据流示例
【发布时间】:2013-04-16 14:40:47
【问题描述】:

我正在处理一个简单的 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。 但是运行程序后,我在控制台中什么也没有,没有错误,也没有“你好,世界”。我错过了什么?

【问题讨论】:

  • 您应该尝试将Thread.sleep(1000) 放入您的App 的正文中。可能是它在执行flow 之前终止。
  • 我会试试的。但我猜 flow {} 只是产生 Future,而 onComplete 是它的回调。所以我需要一些方法来等待未来完成。

标签: scala akka dataflow


【解决方案1】:
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 支持的内容,但从提交日志来看,它似乎正在快速增长,并且很快就会超过它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2021-06-22
    • 1970-01-01
    • 2013-06-04
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多