2014-05-14 18 views
6

Eylem ile action.asyc arasındaki farkı sınamak için 2 eylem yazdım. Ancak, Thread.sleep tamamlandıktan sonra 2 yöntemin her ikisinin de değer döndürdüğünü buldum. Action.asyc, açıklamaya göre değeri hemen döndürmeli mi? Eğer (tarayıcıda yani) bir uç-kullanıcı olarak, gözlenen gibieylem ve action.async arasındaki fark

def intensiveComputation(): Int = { 
    Thread.sleep(5000) 
    return 1 
} 

def testPromise() = Action { 
    Ok("sync" + intensiveComputation()) 
} 

def testPromise = Action.async { 
    val futureint = scala.concurrent.Future { intensiveComputation() } 
    futureint.map(i => Ok("async" + i)) 
} 

cevap

15

, verilen iki kod parçacıkları arasında belirgin bir fark olacaktır.

Buradaki fark, "sync" durumunuzda, tüm iş parçacığı/aktör/her ne olursa olsun, isteğinizi işte yürütmeniz, Thread.sleep'un bitmesini beklerken baş parmaklarını ikiye böler. Buna göre "async" durumda

, elleçleme fonksiyonu aslında çalıştırın ve gelmiştir böylece onu ran kaynak başka şeyler yapmak için yukarı serbest (/ ne olursa olsun iplik/aktör). Future sonuçta tamamlandığında, işi bitirebilir. Biz sync son nokta vurduğunda

def intensiveComputation(): Int = { 
    Logger.info("Sleeping") 
    Thread.sleep(5000) 
    Logger.info("Woke up") 
    return 1 
} 

def testPromiseSync() = Action { 
    val result = Ok("sync" + intensiveComputation()) 
    Logger.info("returning to Play") 
    result 
} 

def testPromiseAsync = Action.async { 
    val futureint = scala.concurrent.Future { intensiveComputation() } 
    val f = futureint.map(i => Ok("async" + i)) 
    Logger.info("returning to Play") 
    f 
} 

görürüz:

farkı görmek için en iyi yolu günlük girdilerini birkaç serpin etmektir

2014-05-14 17:23:39,359 [info] application - Sleeping 
2014-05-14 17:23:44,359 [info] application - Woke up 
2014-05-14 17:23:44,359 [info] application - returning to Play 

Ve async:

2014-05-14 17:24:23,376 [info] application - Sleeping 
2014-05-14 17:24:23,376 [info] application - returning to Play 
2014-05-14 17:24:28,376 [info] application - Woke up 

Action.async numaralı telefonu kullanarak Son kullanıcı deneyimini değiştirmeden tutarken, "bir kerede" daha fazla istekte bulunmak için y.

+0

Çok hızlısın. İyi cevap. – goral

+0

"... ** tüm iş parçacığı/aktör/her neyse-bu, Play'deki isteğinizi işleyen bir şeydi, Thread.sleep'in bitmesini beklerken baş parmaklarını ikiye böldü." Ifadesi bir biraz kafa karıştırıcı. Google Play'deki eylemler varsayılan olarak async olduğundan ve ** iş ** iş parçacığı olduğundan, istek engellenmez. – srzhio