来自Akka文档,Pipelining and Parallelism
Akka Streams处理阶段(无论是简单的Flows和 源或图结)被“融合”在一起并执行 默认顺序。这避免了事件交叉的开销 异步边界但限制流程最多执行一次 在任何特定的时间阶段。
跨越异步边界的事件是什么意思?
同一术语也经常用于A Tale of Two Monix Stream和相应的slides
答案 0 :(得分:3)
当您实现流时,ActorMaterializer
决定如何运行不同的阶段。默认情况下,所有阶段在幕后的同一个actor内顺序运行。这是为了避免在每个阶段将在不同的actor中运行时将发生的线程上下文切换开销。
在舞台上使用async
运算符时,您告诉构造函数您要在该点创建异步边界。这意味着舞台将在幕后运行。根据情况,这可能会影响性能,因为事件将跨越异步边界。
例如:
Source(List("A","B","C "))
.map(x => x.toLowerCase)
.async
.map(x => x.toUpperCase)
.map(x => x.trim)
.runWith(Sink.ignore)
此流将在与map(x => x.toLowerCase)
和map(x => x.toUpperCase)
阶段不同的角色中运行map(x => x.trim)
阶段。最后两个将在同一个演员中运行。
最后要提到的是,异步边界还允许在流内并行处理事件。每个异步边界都可以独立处理事件,因为它们在不同的参与者中运行(只要有来自下游的需求)。在这个简单的场景中," B"可以在map(x => x.toLowerCase)
同时处理" A"正在map(x => x.toUpperCase)
和map(x => x.trim)
处理。
我希望这有助于更多地了解流的工作原理。