Akka-Streams中使用mapAsync的执行上下文

8

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

目前,在我的flows中,我使用mapAsync()与我的rest服务集成,如此处推荐的一样。

我一直在想,mapAsync()应该使用哪个执行上下文? 是ActorSystem的调度程序?全局的? 在任何情况下都有非明显的后果吗?

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


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Giovanni Caporaletti
好的,那么 akka-streams 不应该知道外部服务所在的 ExecutionContext。很好知道 :) - Emil D
是的,Future 是一种抽象,不需要您知道它在哪里运行。它甚至可以是一个预先计算好的值(Future.successful(x))。Flows 有自己的材料化器(以及演员系统和调度程序等),但它们在更抽象的层面上工作。 - Giovanni Caporaletti
好的,那就把它作为答案发布,这样我就可以给你点赞了 :)) - Emil D
1个回答

8
The mapAsync 阶段不需要执行上下文,它只需要你将当前流元素映射到一个 Future。该 future 的执行上下文取决于创建它的人,flow 对此一无所知。
更一般地说,Future[A] 是一个抽象概念,你不需要知道它在哪里运行。它甚至可以是一个不需要执行上下文的预先计算的值:
def mappingFunction(x: Int) = Future.successful(x * 2)
Source(List(1, 2, 3)).mapAsync(1)(mappingFunction)

创建Future时ExecutionContext只需要在意一次,而在mapAsync的情况下,你只需要从函数中返回一个Future即可。创建Future是函数的责任。就mapAsync阶段而言,它只是将Future作为函数的返回值获取,也就是说,它并不创建该Future。
流具有Materializer。其当前实现是ActorMaterializer,它使用ActorSystem(及其分派程序)来具体实现流。但是,您没有必要了解流材料化的细节,因为流在更抽象的层面上工作,并且假设您可以使用不适用于ActorSystem的不同Materializer。

1
这并没有回答重要的问题,因为如果你想要映射未来的结果,你确实需要一个执行上下文。.mapAsync(1)(mappingFunction.flatMap(x => otherFunction(x)))。这似乎会导致线程的爆炸。 - PlexQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接