2013-06-29 34 views
1

假設我有一個服務器Scala,它處理傳入的客戶端請求。我有一個功能def process(req: Request): Response來處理請求。現在我只想同時處理K個請求,並在隊列中保留M個請求。如何在Scala中組織併發請求處理?

Java我可能會創建一個ThreadPoolExecutorK線程和大小M的隊列。現在我想知道如何在ScalaActors/Futures

回答

2

如果你必須有def process(req: Request): Response),那麼我認爲你的Scala解決方案可能會變成類似於Java。如果你可以有def process(req: Request): Future[Response],它會打開其他的可能性。

使用期貨時,您提供(隱式或顯式)可從Java執行程序構建的execution context。所以你可以選擇你的線程池大小和隊列大小。使用期貨的好處是你可以用mapflatMap以及其他幾個組合器來組合它們。有關更多信息,請參閱http://docs.scala-lang.org/overviews/core/futures.html

對於演員,您有另一種併發模型,您可以在其中創建K演員。您可以有一個router將每個請求分派給參與者。每個角色都獨立處理請求,並在處理完成時發送Response以滿足任何需求。關於演員的好處是每個演員都是獨立的,通常不會與其他演員共享任何東西,所以你不必同步代碼。有關更多信息,請參閱http://doc.akka.io/docs/akka/2.1.4/general/terminology.html。總的來說,我認爲Scala可以使用Java所具有的任何東西,並提供更多機制來完成更復雜的事情。