2013-04-11 30 views
9

Các Akka tài liệu nói:Futures để chặn các cuộc gọi trong Scala

bạn có thể bị cám dỗ để chỉ quấn gọi chặn bên trong một tương lai và làm việc với điều đó thay vào đó, nhưng chiến lược này là quá đơn giản: bạn là khá khả năng tìm thấy tắc nghẽn hoặc hết bộ nhớ hoặc chủ đề khi ứng dụng chạy dưới tải tăng lên.

Họ đề nghị các chiến lược sau:

  • Làm gọi chặn trong một Future, đảm bảo một trên ràng buộc về số lượng cuộc gọi như vậy tại bất kỳ thời điểm nào (gửi một số lượng không giới hạn các nhiệm vụ này bản chất sẽ làm cạn kiệt bộ nhớ hoặc giới hạn luồng của bạn).

  • Thực hiện cuộc gọi chặn trong một Future, cung cấp một nhóm luồng có giới hạn trên về số lượng chủ đề phù hợp với phần cứng mà ứng dụng chạy.

Bạn có biết về việc triển khai các chiến lược đó không?

Trả lời

16

Tương lai được chạy trong phạm vi execution contexts. Điều này rõ ràng từ API Future: bất kỳ cuộc gọi nào liên quan đến việc đính kèm một số cuộc gọi lại đến tương lai hoặc để xây dựng tương lai từ tính toán tùy ý hoặc từ một tương lai khác yêu cầu đối tượng có sẵn hoàn toàn có sẵn ExecutionContext. Vì vậy, bạn có thể kiểm soát thiết lập đồng thời cho tương lai của mình bằng cách điều chỉnh ExecutionContext trong đó chúng chạy.

Ví dụ, để thực hiện chiến lược thứ hai bạn có thể làm một cái gì đó giống như

import scala.concurrent.ExecutionContext 
import java.util.concurrent.Executors 
import scala.concurrent.future 

object Main extends App { 

    val ThreadCount = 10 
    implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(ThreadCount)) 

    val f = future { 
    println(s"Hello ! I'm running in an execution context with $ThreadCount threads") 
    } 

} 
+0

Cảm ơn nhưng có vẻ quá Java. Tôi đang tìm cách tiếp cận "Scala-ish" hơn. – Michael

+6

Vâng, tôi không nghĩ rằng nó có nhiều Scala-ish hơn thư viện 'scala.concurrent'. –

+0

Ngoài ra, nó không nhận được thêm bất kỳ "Scala-ish" hơn http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.concurrent.ExecutionContext – axiopisty

2

Akka tự thực hiện tất cả điều này, bạn có thể quấn các cuộc gọi chặn của bạn thành diễn viên và sau đó sử dụng để kiểm soát dispatchers hồ chủ đề thực hiện.

+0

Để thêm vào điều này, vui lòng không sử dụng bộ điều phối mặc định của ActorSystem để thực thi tương lai có chứa các cuộc gọi chặn, vì làm như vậy sẽ tạo ra một nút cổ chai cho các phiên bản Actor. Tốt hơn là nên phân bổ một ExecutionContext riêng biệt để thực thi các mã chặn này. – lolski

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