Sự khác biệt giữa Tương lai và Lời hứa là gì?


73

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.


4
"Tương lai hứa hẹn người tiêu dùng sản xuất". (Nhưng để lập trình, hoán đổi hai cái cuối cùng vì Futures (không hoặc nhiều hơn) tương tự như tiêu thụ một giá trị và Promise (chỉ có cái đầu tiên có thể thành công) tương tự như tạo ra một giá trị.)
rwong

Bài giảng tuyệt vời về tương lai / lời hứa về coursera "Nguyên tắc lập trình phản ứng" của Martin Oderky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , Tuần 3
GKislin

@rwong: "Tương lai hứa với người tiêu dùng sản xuất" - hả? Đây có phải là một câu có ý nghĩa hoạt động như một bản ghi nhớ để nhắc nhở chúng ta về sự khác biệt giữa tương lai và lời hứa? Bộ não của tôi đã hoàn toàn thất bại để phân tích nó. Và bạn cũng nói rằng nó sai và cần các từ hoán đổi, nhưng vì một số lý do bạn chưa làm điều này trước khi gõ nó. Và cuối cùng, nó được trích dẫn, nhưng googling nó không đưa ra bất kỳ hit nào ngoài nhận xét của bạn. Vướng mắc lớn.
thịt xông khói

Câu trả lời:


54

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, Futurevề cơ bản, một tham chiếu chỉ đọc đến một giá trị chưa được tính toán. A Promiselà 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ả Futures và Promises, nhưng bạn chỉ có thể viết cho Promises. Bạn có thể có được Futureliên kết với a Promisebằng cách gọi futurephươ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).



19

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 Futurelà thao tác chỉ đọc, trong khi đó Promisecung 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 Promiselà 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.


Đây là trường hợp của JS Promising và Python Futures.
Nick Sweeting

6

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.