2013-12-16 12 views
6

Ho letto un paio di tutorial su come affrontare la concorrenza in gioco e ha trovato alcuni esempi:concorrenza in Play 2.1 o superiore

Asynchronous lavoro

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) 
    } 
} 

Lavoro pianificato

Beh, sono un po 'confuso ... il primo esempio utilizza scala.concurrent.ExecutionContext.Implicits.global mentre il il secondo esempio utilizza play.api.libs.concurrent.Execution.Implicits.defaultContext. Perché? Qualcuno potrebbe spiegarmi cosa sta succedendo dietro la scena?

+0

Il file "ExecutingContext" era simile a ExecutorService di java (Pool di thread), puoi persino crearlo da solo, se lo desideri. Ad esempio, il modulo play-slick usa un contesto separato per eseguire le operazioni db. https://github.com/freekh/play-slick/blob/master/src/main/scala/play/api/db/slick/SlickExecutionContext.scala – jilen

risposta

3

Scala utilizza uno ExecutionContext per alcune cose asincrone (Futures, Promises). Un ExecutionContext può essere pensato come un pool di thread, in cui è possibile inviare Runnables per l'esecuzione su uno dei thread. (Non è necessariamente sempre un pool di thread, ma tende ad essere).

Il modo in cui viene utilizzato ExecutionContext è di solito passare come argomento implicit alla funzione che lo utilizzerà. Si vedono spesso le firme dei metodi in questo modo:

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

Il metodo "doAsyncThings" utilizzerà il implicita exc che viene passato a mettere il lavoro su un thread separato.

Per rispondere alla domanda, le importazioni Implicits dei due esempi sono istanze implicite di ExecutionContext, necessarie per chiamare i metodi future e scheduleOnce. A fini esplorativi, non importa quale usi. Lo global della libreria scala contiene (iirc) un pool di thread con 8 o più thread. Direi che il gioco è simile. A meno che tu non stia attento in modo particolare a quali thread fanno ciò che funziona, la scelta non dovrebbe influire su di te.

-2

Direi che la differenza deriva da "10 secondi". la capacità di nominare letteralmente i tempi non è integrata nella lingua. "secondi" viene convertito implicitamente in DurationInt.

+0

Questo non ha nulla a che fare con il dispatcher, viene dal ' scala.concurrent.duration._' import. – Ryan

Problemi correlati