2016-03-08 36 views
4

我剛開始接觸阿卡流和我試圖想辦法的mapAsync在阿卡流使用:的ExecutionContext與

目前,我的流量,我使用mapAsync()與我休息服務進行整合,建議here

我一直想知道,有什麼執行上下文應mapAsync()是使用? 它應該是我的ActorSystem的調度員嗎?全球? 在這兩種情況下是否有任何非顯而易見的後果?

我意識到這可能是一個愚蠢的問題,但我從來沒有處理之前阿卡,並在涉及期貨的任何應用程序階,我只用過全球執行上下文。

+0

mapAsync不需要任何執行上下文。你未來的執行上下文只取決於誰創建它,流無關吧:) –

+0

好了,阿卡流是不應該知道在外部服務正在運行的執行上下文的。很高興知道:) –

+0

是的,Future是一個抽象,不需要你知道它在哪裏運行。它甚至可能是一個預先計算的值afayk(Future.successful(x))。流量有他們自己的物化器(和演員系統和調度員等),但他們在更抽象的水平上工作 –

回答

6

mapAsync階段不需要執行上下文,它只需要將當前流元素映射到Future。未來的執行環境取決於誰創建它,流程不知道任何事情。

更一般地,Future[A]是不要求你知道它的運行的抽象。它甚至可能是不需要執行上下文的預計算值:

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

你只需要在創建未來擔心ExecutionContexts,但在mapAsync的情況下,你只是一個返回從功能。如何創造未來是該職能的責任。就mapAsync階段而言,它只是將未來作爲函數的返回值,即它不創建它。

流有Materializer。它目前的實現是ActorMaterializer,它使用ActorSystem(及其調度器)來實現流。儘管您不需要知道流實現的細節,但流的工作方式更抽象,假設您可以使用不同於ActorSystem的Materializer

相關問題