Sự khác biệt giữa Tương lai và Lời hứa là gì? (Trong Akka và Gpars.)
Chúng trông giống nhau đối với tôi khi cả hai chặn và trả về giá trị của tương lai khi được gọi và một lời hứa là sẽ nhận được kết quả của một tương lai.
Sự khác biệt giữa Tương lai và Lời hứa là gì? (Trong Akka và Gpars.)
Chúng trông giống nhau đối với tôi khi cả hai chặn và trả về giá trị của tương lai khi được gọi và một lời hứa là sẽ nhận được kết quả của một tương lai.
Câu trả lời:
Tôi sẽ nói về Akka / Scala, vì tôi không quen thuộc với Gpars cũng như với Akka / Java.
Trong Scala 2.10, bao gồm phần có liên quan của Akka trong bản phân phối tiêu chuẩn, Future
về cơ bản, một tham chiếu chỉ đọc đến một giá trị chưa được tính toán. A Promise
là khá giống nhau ngoại trừ bạn cũng có thể viết cho nó . Nói cách khác, bạn có thể đọc từ cả Future
s và Promise
s, nhưng bạn chỉ có thể viết cho Promise
s. Bạn có thể có được Future
liên kết với a Promise
bằng cách gọi future
phương thức trên nó, nhưng chuyển đổi theo hướng khác là không thể (vì nó sẽ vô nghĩa).
Theo wikipedia , chúng là cùng một khái niệm:
Trong khoa học máy tính, tương lai, lời hứa và sự chậm trễ đề cập đến các cấu trúc được sử dụng để đồng bộ hóa trong một số ngôn ngữ lập trình đồng thời. Họ mô tả một đối tượng hoạt động như một proxy cho kết quả ban đầu không xác định, thường là do tính toán giá trị của nó chưa hoàn chỉnh.
Một số thư viện có thể chọn gọi chúng theo một cách, một số có thể chọn gọi chúng theo cách khác. Và mỗi lần, chúng có thể được thực hiện trong các hương vị khác nhau. Một số thư viện có thể chọn sử dụng các từ đồng nghĩa này để phân biệt các hương vị khác nhau. Mặc dù tôi sẽ cho rằng đây là một lựa chọn tồi (vì rõ ràng nó gây nhầm lẫn cho mọi người), liên kết này cho thấy rằng trong Scala thực tiễn phổ biến này.
Như Flame của @ Ptharien đã đề xuất, trong Scala a Future
là thao tác chỉ đọc, trong khi đó Promise
cung cấp cho bạn khả năng mang lại kết quả (hoặc thất bại) cho hoạt động mà nó thể hiện.
Một Promise
là do sử dụng tốt nhất bằng mã chịu trách nhiệm để thực hiện các hoạt động tuyên truyền kết quả, trong khi một Future
được sử dụng để tiếp xúc với mã khách hàng, mà lần lượt sẽ chờ đợi kết quả. Nhưng một lần nữa, xin lưu ý rằng sự khác biệt này là cụ thể của Scala và có thể gây nhầm lẫn cho người ngoài.
Tôi sẽ thêm một chút ở đây vì tôi đã làm việc với rất nhiều Tương lai trong Java vào cuối nhưng cũng có nền tảng về phát triển Scala / Akka. Câu trả lời này chủ yếu sẽ nhân đôi những gì đã nói nhưng sẽ chỉ ra rất nhiều triển khai được sử dụng phổ biến hiện nay trên JVM.
Đầu tiên, poster gốc đề cập đến việc sử dụng get và chặn - vui lòng không bao giờ thực hiện việc này ngoài các bài kiểm tra.
Khi tôi dạy các khái niệm FP và đồng thời trong vai trò hiện tại của mình, trước tiên tôi nói với sinh viên rằng những lời hứa và tương lai về mặt ngữ nghĩa là từ đồng nghĩa bởi vì là người tiêu dùng của một lời hứa hoặc một api trong tương lai, nhà phát triển không cần phải hiểu rằng có hoặc NẾU có sự khác biệt về ngữ nghĩa - chỉ các cơ chế xử lý chúng mà không chặn IO.
Để nói rằng một tương lai không thể hoàn thành và một lời hứa có thể (ví dụ như theo scala / akka / play apis chẳng hạn) là quá đơn giản:
Một số Tương lai có thể được hoàn thành Java8 bây giờ giới thiệu CompleteableFuture vào thư viện chuẩn.
Một số lời hứa không thể được hoàn thành Tương tự, trong API lời hứa Play, một lời hứa không thể được thực hiện nhưng RedeemablePromise có thể chơi giới thiệu một ngữ nghĩa khác - ngay cả khi nằm dưới chiếc ô An toàn. Hơn nữa, API hứa hẹn có thể chuyển đổi với tương lai scala theo cả hai hướng - (F.Promise.wrap (tương lai) hoặc Prom.wrapping ()).
Làm việc với công nghệ Formsafe trên Java8, bạn sẽ thường xuyên qua lại giữa các tương lai / lời hứa chỉ vì một API thích hợp hơn (Play Promise API có vẻ tốt hơn với lambdas Java8). Trên Akka + Play + Java8, bạn sẽ nhận được tương lai từ các Diễn viên và gói chúng vào các lời hứa, soạn thảo các cuộc gọi lại và trả lại điều đó từ bộ điều khiển.
Vì vậy, như tôi nói với mọi người khi tôi dạy, Lời hứa và Tương lai ít nhiều là từ đồng nghĩa.