2013-04-19 30 views
7

Giả sử tôi cần chạy một vài tác vụ đồng thời.Khi nào tương lai có thể phù hợp hơn diễn viên (hoặc ngược lại) ở Scala?

tôi có thể quấn mỗi công việc trong một Future và chờ đợi kết thúc. Ngoài ra, tôi có thể tạo một Actor cho mỗi tác vụ. Mỗi Actor sẽ thực thi tác vụ của nó (ví dụ: khi nhận được thông báo "bắt đầu") và gửi kết quả trở lại.

Tôi tự hỏi khi tôi nên sử dụng trước đây (với Future s) và sau (với Actor s) cách tiếp cận và tại sao cách tiếp cận Future được coi là tốt hơn đối với trường hợp được mô tả ở trên.

Trả lời

6

Bởi vì nó là cú pháp đơn giản hơn.

val tasks: Seq[() => T] = ??? 
val futures = tasks map { 
    t => future { t() } 
} 
val results: Future[Seq[T]] = Future.sequence(futures) 

Các results tương lai thì bạn có thể chờ đợi vào việc sử dụng Await.result hoặc bạn có thể bản đồ nó thêm/sử dụng nó trong cho-hiểu hoặc cài đặt callbacks trên đó.

So sánh điều đó để khởi tạo tất cả các diễn viên, gửi tin nhắn cho họ, mã hóa các khối receive của họ, nhận phản hồi từ họ và tắt chúng - thường sẽ yêu cầu thêm bản mẫu.

+0

Vì vậy, sự khác biệt duy nhất chỉ là cú pháp. Nó có đúng không? – Michael

+2

Sự khác biệt cũng nằm trong triển khai cơ bản, nhưng mô hình diễn viên nói chung là một mô hình lập trình mạnh mẽ và biểu cảm hơn - bạn có thể tạo một API tương tự API tương lai bằng cách sử dụng các diễn viên. Các diễn viên triển khai sử dụng tương lai sẽ cồng kềnh hơn. – axel22

+0

Ok, tôi thấy sự khác biệt giữa các mô hình. Bạn có thể giải thích sự khác biệt b/w việc triển khai? – Michael

5

Theo nguyên tắc chung, sử dụng mô hình đồng thời đơn giản phù hợp với ứng dụng của bạn, chứ không phải là mạnh nhất. Việc sắp xếp từ đơn giản đến phức tạp nhất sẽ là lập trình tuần tự-> các bộ sưu tập song song-> tương lai-> các tác nhân không quốc tịch-> các trình diễn state-> chủ đề với bộ nhớ giao dịch phần mềm-> chủ đề với các khóa khóa rõ ràng với các thuật toán không khóa. Chọn người đầu tiên trong danh sách này giải quyết vấn đề của bạn. Bạn càng đi sâu vào danh sách đó càng nhiều thì càng phức tạp và rủi ro, vì vậy bạn nên giảm bớt sự đơn giản cho sức mạnh khái niệm.

+0

Bạn lấy chuỗi đó từ đâu? Đối với tôi, có vẻ không nhất quán, khi sử dụng tương lai hàm ý các chủ đề có khóa rõ ràng. Và, các chủ đề có khóa ẩn (sử dụng hàng đợi chặn). Ngoài ra, nam diễn viên của bạn có bao nhiêu yếu tố đầu vào? nếu chỉ có một (diễn viên scala và akka), thì bạn nên liệt kê riêng các diễn viên đa đầu vào. Nếu các diễn viên bạn ngụ ý có thể có nhiều đầu vào, thì không có sự khác biệt giữa các tác nhân không trạng thái và trạng thái (trạng thái là một mã thông báo được nhập vào một đầu vào bổ sung). –

+1

Danh sách chỉ là ý kiến ​​cá nhân. Các thay đổi của bạn là hợp lý, ngoại trừ tương lai không có cách nào ngụ ý chủ đề và khóa rõ ràng. Các tương lai không có hiệu ứng phụ có hiệu quả mô hình các biến dataflow, và đạt được sự tương tranh mà không cho phép không xác định. –

+0

Tương lai trong Java (java.util.concurrent.Future), và trong hầu hết các ngôn ngữ khác (xem http://en.wikipedia.org/wiki/Futures_and_promises) đang chặn, và do đó hàm ý đề. Bạn đang nói về tương lai gì? –

0

tôi có xu hướng nghĩ rằng diễn viên này rất hữu ích khi bạn đã tương tác chủ đề. Trong trường hợp của bạn, có vẻ như tất cả các công việc đều độc lập; Tôi sẽ sử dụng tương lai.

+1

Đọc các câu trả lời khác, tôi nghĩ một câu trả lời mới nên được xây dựng thêm một chút. – manuell

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