我刚刚开始使用 Akka Stream,我正试图弄清楚:
目前,在我的流程中,我正在使用 mapAsync() 与我的休息服务集成,如此处所推荐的。
我一直在想, mapAsync() 应该使用什么执行上下文?它应该是我的 ActorSystem 的调度员吗?全球?在这两种情况下是否有任何不明显的后果?
我意识到这可能是一个愚蠢的问题,但我以前从未处理过 Akka,在任何涉及 Futures 的 scala 应用程序中,我只使用过全局执行上下文。
我刚刚开始使用 Akka Stream,我正试图弄清楚:
目前,在我的流程中,我正在使用 mapAsync() 与我的休息服务集成,如此处所推荐的。
我一直在想, mapAsync() 应该使用什么执行上下文?它应该是我的 ActorSystem 的调度员吗?全球?在这两种情况下是否有任何不明显的后果?
我意识到这可能是一个愚蠢的问题,但我以前从未处理过 Akka,在任何涉及 Futures 的 scala 应用程序中,我只使用过全局执行上下文。
mapAsync阶段不需要执行上下文,它只需要您将当前流元素映射到Future
. 未来的执行上下文取决于谁创建它,流程对此一无所知。
更一般地说,aFuture[A]
是一种抽象,不需要您知道它在哪里运行。它甚至可以是一个不需要执行上下文的预计算值:
def mappingFunction(x: Int) = Future.successful(x * 2)
Source(List(1, 2, 3)).mapAsync(1)(mappingFunction)
您只需要在创建 Future 时担心 ExecutionContexts,但在 mapAsync 的情况下,您只是从函数中返回一个。如何创造未来是职能部门的责任。就mapAsync 阶段而言,它只是将future 作为函数的返回值,即它不创建它。
流有一个Materializer
. 它当前的实现是ActorMaterializer
,它使用 ActorSystem (及其调度程序)实现流。但是,您不需要了解流具体化的细节,流在更抽象的级别上工作,假设您可能有一个Materializer
不能与 ActorSystem 一起使用的不同