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

Scala 在Akka Streams中与mapAsync一起使用的ExecutionContext,scala,akka-stream,executioncontext,Scala,Akka Stream,Executioncontext,我刚刚开始学习Akka Stream,我正在努力想办法: 目前,在我的流中,我使用mapAsync()与我的rest服务集成,这是推荐的 我一直在想,mapAsync()应该使用什么执行上下文? 它应该是我的ActorSystem的调度器吗?全球? 在这两种情况下都会有不明显的后果吗 我意识到这可能是一个愚蠢的问题,但我以前从未处理过Akka,在任何涉及期货的scala应用程序中,我只使用过全局执行上下文。该阶段不需要执行上下文,它只需要将当前流元素映射到未来。未来的执行上下文取决于谁创建了它,

我刚刚开始学习Akka Stream,我正在努力想办法:

目前,在我的流中,我使用mapAsync()与我的rest服务集成,这是推荐的

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

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

该阶段不需要执行上下文,它只需要将当前流元素映射到未来。未来的执行上下文取决于谁创建了它,流对此一无所知

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

def mappingFunction(x: Int) = Future.successful(x * 2)
Source(List(1, 2, 3)).mapAsync(1)(mappingFunction)
在创建未来时,您只需要担心ExecutionContext,但对于mapAsync,您只是从函数返回一个。如何创造未来是职能部门的责任。就mapAsync阶段而言,它只获取未来作为函数的返回值,即它不创建未来


流有一个
物化器
。它当前的实现是
Actormatarializer
,它使用ActorSystem(及其dispatchers)具体化流。虽然您不需要知道流具体化的细节,但流是在更抽象的级别上工作的,假设您可以有一个不同的
物化器
,它不与ActorSystem一起工作

mapAsync不需要任何执行上下文。未来的执行上下文只取决于谁创建它,流与此无关:)好的,所以akka streams不应该知道外部服务运行的ExecutionContext。很高兴知道:)是的,未来是一个抽象概念,不需要你知道它在哪里运行。它甚至可以是预先计算的值afayk(Future.successful(x))。流有自己的物化器(以及参与者系统和分派器等),但它们在更抽象的层次上工作好吧,将其作为一个答案发布,这样我就可以+1 you:))这并没有回答这个重要的问题,因为如果你随后映射未来的结果,你确实需要一个执行上下文。mapAync(1)(mappingFunction.flatMap(x=>otherFunction(x)))。这可能会导致线程爆炸。