重现akka-stream异步输出

时间:2016-02-07 13:13:36

标签: multithreading scala akka-stream

我是akka-stream的新手,所以想问一下如何重现本文中提到的行为http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.2/scala/stream-rate.html

对于给定的代码

Source(1 to 3)
  .map { i => println(s"A: $i"); i }
  .map { i => println(s"B: $i"); i }
  .map { i => println(s"C: $i"); i }
  .runWith(Sink.ignore)

获得类似的

A: 1
A: 2
B: 1
A: 3
B: 2
C: 1
B: 3
C: 2
C: 3

我尝试添加一些随机Thread.sleep, 从无限迭代器创建一个流。 但Akka因此对调试输出始终使用相同的线程进行处理。

所以问题是:如何使用akka-stream重现异步行为(每个阶段应该以异步方式运行)?

1 个答案:

答案 0 :(得分:2)

您看到顺序操作的原因是因为所有操作都在同一个Source之外,因此在同一个异步边界内。获得"异步行为"您正在寻找您需要添加Flows

implicit val actorSystem = ActorSystem()
implicit val actorMaterializer = ActorMaterializer()

Source(1 to 3).via(Flow[Int].map{i => println(s"A: $i"); i })
              .via(Flow[Int].map{i => println(s"B: $i"); i })
              .via(Flow[Int].map{i => println(s"C: $i"); i })
              .runWith(Sink.ignore)

每个Flow都将成为一个单独的Actor。注意:为了获得真正的并发性,ActorSystem正在运行的线程池必须具有多于1个线程。

要记住一件事:ActorSystem的好处是它承担了对操作的低级控制的责任,以便开发人员可以专注于"业务逻辑"。这也可能是一个缺点。根据您的ActorSystem配置,JVM配置和硬件配置,操作顺序可能仍然是同步的。