2013-12-16 36 views
6

我讀過如何處理與播放併發一些教程,並發現了一些例子:併發播放2.1以上

異步工作

import scala.concurrent.{ExecutionContext, future} 

def sendEmailAsync(from: String, to: String, subject: String, body: String) = { 
    import ExecutionContext.Implicits.global // in scala.concurrent 

    future { 
    EmailHelper.sendEmail(from, to, subject, body) 
    } 
} 

預定作業

import play.api.libs.concurrent.{Akka, Execution} 

def sendEmailOnSchedule(from: String, to: String, subject: String, body: String) = { 
    import scala.concurrent.duration._ 
    import Execution.Implicits.defaultContext // in play.api.libs.concurrent 

    Akka.system.scheduler.scheduleOnce(10 seconds) { 
    EmailHelper.sendEmail(from, to, subject, body) 
    } 
} 

那麼,我有點困惑......第一個例子使用scala.concurrent.ExecutionContext.Implicits.global,而第二個例子使用play.api.libs.concurrent.Execution.Implicits.defaultContext。爲什麼?有人能解釋我幕後發生了什麼嗎?

+0

'ExecutingContext'就像java的ExecutorService(線程池),你甚至可以自己創建它,如果你喜歡。例如,play-slick模塊使用分離的上下文來執行數據庫操作。 https://github.com/freekh/play-slick/blob/master/src/main/scala/play/api/db/slick/SlickExecutionContext.scala – jilen

回答

3

斯卡拉使用ExecutionContext一些異步的東西(期貨,承諾)。 ExecutionContext可以被認爲是一個線程池,其中Runnables可以被提交在其中一個線程上運行。 (它不一定總是一個線程池,但往往是)。

ExecutionContext的使用方式通常是將它作爲implicit參數傳遞給將使用它的函數。你會經常看到的方法簽名是這樣的:

def doAsyncThings(args: Args)(implicit exc: ExecutionContext): Future[Result] 

的「doAsyncThings」方法將使用獲取傳遞中把工作推上一個單獨的線程隱exc

要回答你的問題,從這兩個示例中導入的Implicits是隱式ExecutionContext實例,調用futurescheduleOnce方法需要這些實例。出於探索的目的,使用哪一個並不重要。來自scala庫的global包含(iirc)具有8個左右線程的線程池。我猜想這個戲是類似的。除非你非常小心哪些線程做了什麼工作,這個選擇不應該影響你。

-2

我猜想差異來自「10秒」。字面上命名時間的能力不是內置於語言中的。 「秒」被隱式轉換爲DurationInt。

+0

這與調度程序無關,它來自' scala.concurrent.duration._'導入。 – Ryan