2013-12-16 12 views
6

Tôi đã đọc một vài hướng dẫn về làm thế nào để đối phó với đồng thời trong Play và tìm thấy một số ví dụ:Concurrency in Chơi 2.1 hoặc cao hơn

Asynchronous Job

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

Theo lịch trình công việc

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

Vâng, tôi hơi bối rối ... ví dụ đầu tiên sử dụng scala.concurrent.ExecutionContext.Implicits.global trong khi ví dụ thứ hai sử dụng play.api.libs.concurrent.Execution.Implicits.defaultContext. Tại sao? Ai đó có thể giải thích cho tôi những gì đang xảy ra đằng sau hiện trường?

+0

'ExecutingContext' giống như ExecutorService của java (Thread Pool), bạn thậm chí có thể tự tạo nó nếu bạn muốn. Ví dụ, mô-đun play-slick sử dụng một bối cảnh riêng biệt để thực hiện các hoạt động db. https://github.com/freekh/play-slick/blob/master/src/main/scala/play/api/db/slick/SlickExecutionContext.scala – jilen

Trả lời

3

Scala sử dụng ExecutionContext cho một số thứ không đồng bộ (Tương lai, Lời hứa). Một ExecutionContext có thể được coi như một Thread Pool, trong đó Runnables có thể được đệ trình để chạy trên một trong các luồng. (Nó không nhất thiết phải luôn luôn là một hồ bơi thread, nhưng nó có xu hướng).

Cách ExecutionContext được sử dụng thường để chuyển nó thành đối số implicit cho hàm sẽ sử dụng nó. Bạn thường sẽ thấy chữ ký phương pháp như thế này:

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

Các "doAsyncThings" phương pháp sẽ sử dụng ngầm exc đó được thông qua vào đặt công việc lên một chủ đề riêng biệt.

Để trả lời câu hỏi của bạn, nhập khẩu Implicits từ hai ví dụ là trường hợp ExecutionContext ẩn, cần thiết để gọi phương thức futurescheduleOnce. Đối với mục đích thăm dò, nó không quan trọng mà bạn sử dụng. Các global một từ thư viện scala chứa (iirc) một hồ bơi thread với 8 hoặc hơn đề. Tôi đoán rằng trò chơi tương tự. Trừ khi bạn đang được cẩn thận hơn về những chủ đề làm những gì làm việc, sự lựa chọn không nên ảnh hưởng đến bạn.

-2

Tôi đoán sự khác biệt xuất phát từ "10 giây". khả năng đặt tên theo thời gian như không được tích hợp vào ngôn ngữ. "giây" được chuyển đổi hoàn toàn thành DurationInt.

+0

Điều này không liên quan gì đến người điều phối, nó đến từ ' nhập scala.concurrent.duration._'. – Ryan

Các vấn đề liên quan