Akka stream 为什么这个简单的Akka Streams程序永远不会终止?

Akka stream 为什么这个简单的Akka Streams程序永远不会终止?,akka-stream,Akka Stream,这应该是一个简单的问题。我正在使用Akka 2.4.2(包含Akka流和HTTP)。我希望这个Source能够完成&程序会终止,因为Source是有限的,但它永远不会。为什么这个程序不终止 import scala.concurrent._ import scala.collection.immutable._ import akka._ import akka.actor._ import akka.stream._ import akka.stream.scaladsl._ import a

这应该是一个简单的问题。我正在使用Akka 2.4.2(包含Akka流和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使用非daemonic线程,所以它将保持应用程序运行,直到您关闭ActorSystem

您可以通过以下方式执行此操作:

import system.dispatcher
s.runForeach(println).onComplete { _ =>  system.terminate() }
import system.dispatcher
s.runForeach(println).onComplete { _ =>  system.terminate() }
因为Akka使用,所以它将保持应用程序运行,直到您关闭
ActorSystem
。这是因为典型的用例是在主方法中启动系统,然后所有计算都发生在ActorSystem管理的线程上(即
main()
线程被留下来完成并离开-如果线程是守护线程,应用程序将关闭,这不是我们通常想要的)

您可以通过以下方式执行此操作:

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