为什么这个简单的 Akka Streams 程序永远不会终止?
Why does this simple Akka Streams program never terminate?
应该是个简单的问题。我正在使用 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
)
}
已在 https://groups.google.com/d/msg/akka-user/u3MXlfVpm40/LHyYruS0HgAJ by https://whosebug.com/users/111024/konrad-ktoso-malawski 回答,为方便起见复制此处;归功于他:
因为 Akka 使用非守护线程,所以它会保留应用程序 运行 直到您关闭 ActorSystem。
您可以通过以下方式这样做:
import system.dispatcher
s.runForeach(println).onComplete { _ => system.terminate() }
因为 Akka 使用 non-daemonic threads,所以它会保留应用程序 运行,直到您关闭 ActorSystem
。这是因为典型的用例是在您的 main 方法中启动系统,然后所有计算都发生在 ActorSystem 管理的线程上(即 main()
线程被留下来完成并消失 - 如果线程是守护进程应用程序会关闭,这不是我们通常想要的。
您可以通过以下方式进行:
import system.dispatcher
s.runForeach(println).onComplete { _ => system.terminate() }
应该是个简单的问题。我正在使用 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
)
}
已在 https://groups.google.com/d/msg/akka-user/u3MXlfVpm40/LHyYruS0HgAJ by https://whosebug.com/users/111024/konrad-ktoso-malawski 回答,为方便起见复制此处;归功于他:
因为 Akka 使用非守护线程,所以它会保留应用程序 运行 直到您关闭 ActorSystem。
您可以通过以下方式这样做:
import system.dispatcher
s.runForeach(println).onComplete { _ => system.terminate() }
因为 Akka 使用 non-daemonic threads,所以它会保留应用程序 运行,直到您关闭 ActorSystem
。这是因为典型的用例是在您的 main 方法中启动系统,然后所有计算都发生在 ActorSystem 管理的线程上(即 main()
线程被留下来完成并消失 - 如果线程是守护进程应用程序会关闭,这不是我们通常想要的。
您可以通过以下方式进行:
import system.dispatcher
s.runForeach(println).onComplete { _ => system.terminate() }