【问题标题】:Why does this simple Akka Streams program never terminate?为什么这个简单的 Akka Streams 程序永远不会终止?
【发布时间】:2016-02-23 17:05:50
【问题描述】:

应该是一个简单的问题。我正在使用 Akka 2.4.2(包含 Akka Streams 和 HTTP)。我希望这个Source 完成并终止程序,因为Source 是有限的,但它永远不会。为什么这个程序不终止?

import scala.concurrent._
import scala.collection.immutable._
import akka._
import akka.actor._
import akka.stream._
import akka.stream.scaladsl._
import akka.util._

object Test extends App {

  implicit val system = ActorSystem("TestSystem")
  implicit val materializer = ActorMaterializer()

  val s = Source.single(1)
  s.runForeach(println)
}

输出:

$ sbt run
...
[info] Running Test
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] logger log1-Logging$DefaultLogger started
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] Default Loggers started
1

我的build.sbt 文件的相关部分:

scalaVersion  := "2.11.7"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")

libraryDependencies ++= {
  val akkaVersion = "2.4.2"
  Seq(
    "com.typesafe.akka" %%  "akka-stream" % akkaVersion
  )
}

【问题讨论】:

    标签: akka-stream


    【解决方案1】:

    因为 Akka 使用 non-daemonic threads,所以它会保持应用程序运行,直到您关闭 ActorSystem。这是因为典型的用例是在您的 main 方法中启动系统,然后所有计算都发生在 ActorSystem 管理的线程上(即,main() 线程留待完成并离开 - 如果线程是守护进程,应用程序将关闭,这不是我们通常想要的)。

    您可以通过以下方式进行:

    import system.dispatcher
    s.runForeach(println).onComplete { _ =>  system.terminate() }
    

    【讨论】:

      【解决方案2】:

      https://stackoverflow.com/users/111024/konrad-ktoso-malawskihttps://groups.google.com/d/msg/akka-user/u3MXlfVpm40/LHyYruS0HgAJ回答,为方便起见,复制到这里;归功于他:

      因为 Akka 使用非守护线程,所以它会保持应用程序运行,直到您关闭 ActorSystem。

      您可以通过以下方式进行:

      import system.dispatcher
      s.runForeach(println).onComplete { _ =>  system.terminate() }
      

      【讨论】:

        猜你喜欢
        • 2015-01-09
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 2013-06-10
        相关资源
        最近更新 更多