2013-12-16 24 views
6

yukarıda bazı örneklerini Play eşzamanlılık ile nasıl başa çıkılacağı konusunda birkaç öğreticiler okumak ve buldum:eşzamanlılık 2.1 veya

Asenkron İşi

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

Programlı İşe

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

Biraz kafam karıştı ... İlk örnekte scala.concurrent.ExecutionContext.Implicits.global kullanılıyor. ikinci örnekte play.api.libs.concurrent.Execution.Implicits.defaultContext kullanılır. Niye ya? Birisi bana olayın arkasında neler olduğunu anlatabilir mi?

+0

"ExecutingContext" java'nın ExecutorService (Thread Pool) gibi bir şeydi, isterseniz kendiniz bile oluşturabilirsiniz. Örneğin, play-slick modülü yürütme db işlemlerine ayrılmış bir bağlam kullanır. https://github.com/freekh/play-slick/blob/master/src/main/scala/play/api/db/slick/SlickExecutionContext.scala – jilen

cevap

3

Scala, bazı zaman uyumsuz şeyler (Futures, Promises) için ExecutionContext kullanır. Bir ExecutionContext, bir iş parçacığı üzerinde çalıştırmak için Runnables gönderilebildiği bir iş parçacığı havuzu gibi düşünülebilir. (Her zaman bir iplik havuzu değil, ama olma eğilimindedir).

ExecutionContext'in kullanıldığı yol genellikle onu kullanacağı işleve bir implicit argümanı olarak iletmektir. Sık sık böyle bir yöntem imzalarını görürsünüz:

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

"doAsyncThings" yöntemi ayrı bir iş parçacığı üzerine çalışmalarını koymak geçirilen alır örtük exc kullanacaktır.

Sorunuzu yanıtlamak için, iki örnekte bulunan Implicits içe aktarma, future ve scheduleOnce yöntemlerini çağırmak için gerekli olan örtülü ExecutionContext örnekleridir. Keşif amaçlı, hangisini kullandığınız önemli değil. Scala kütüphanesinden gelen global, (iirc) 8 ya da daha fazla dişe sahip bir iplik havuzunu içerir. Oyunun benzer olduğunu tahmin ederdim. Hangi işlerin hangi işi yapacağı konusunda fazla dikkatli değilseniz, seçim sizi etkilememelidir.

-2

Farkın "10 saniye" dan geldiğini tahmin ediyorum. kelimenin tam anlamıyla isimlerini söyleme yeteneği, dile yerleşik değildir. "saniye" örtük olarak DurationInt'e dönüştürülür.

+0

Bunun dağıtıcıyla ilgisi yok, scala.concurrent.duration._' içe aktarma. – Ryan