在Akka-Streams中与mapAsync一起使用的ExecutionContext

时间:2016-03-08 00:31:29

标签: scala akka-stream executioncontext

我刚刚开始使用Akka Stream,我正在尝试解决问题:

目前,在我的流程中,我使用mapAsync()与我的其他服务集成,如建议here

我一直在想,mapAsync()应该使用什么执行上下文? 它应该是我的ActorSystem的调度员吗?全球? 在这两种情况下都有任何不明显的后果吗?

我意识到这可能是一个愚蠢的问题,但我以前从未处理过Akka,而且在任何涉及期货的scala应用程序中,我只使用过全局执行环境。

1 个答案:

答案 0 :(得分:8)

mapAsync阶段不需要执行上下文,它只需要您将当前流元素映射到Future。未来的执行环境取决于谁创造它,流程对它没有任何了解。

更一般地说,Future[A]是一种抽象,不需要你知道它在哪里运行。它甚至可以是不需要执行上下文的预先计算的值:

def mappingFunction(x: Int) = Future.successful(x * 2)
Source(List(1, 2, 3)).mapAsync(1)(mappingFunction)

创建Future时只需要担心ExecutionContexts,但是对于mapAsync,你只需从函数返回一个。如何创造未来是职能的责任。就mapAsync阶段而言,它只是将未来作为函数的返回值,即它不会创建它。

流量为Materializer。它的当前实现是ActorMaterializer,它使用ActorSystem(及其调度程序)实现流。您不需要知道流实现的细节,但是流工作在更抽象的层次上,并且假设您可以使用不同于ActorSystem的不同Materializer