Future 与 Promise 是表示异步计算结果的并发设计模式:Future 是一个占位对象,代表将来才会就绪的值;Promise 则是写入该值的一端。调用方无需阻塞等待,可通过回调或组合子在结果就绪时继续处理,是现代异步编程的基石。

| 英文名 | Futures and Promises |
| 概念起源 | 1977 年 Baker 与 Hewitt |
| 早期实现 | MultiLisp、Argus |
| 现代实现 | JS Promise、CompletableFuture |
| 配套语法 | async/await |
Future 与 Promise 模式是一种处理异步计算的设计模式:发起耗时操作时立即返回一个代表未来结果的占位对象(Future),真正的结果由另一端(Promise)在计算完成时填入。调用方既可以稍后读取,也可以注册回调,让程序在结果就绪时自动继续。
相关概念可追溯到 1977 年亨利·贝克(Henry Baker)与卡尔·休伊特(Carl Hewitt)的研究,以及 1985 年 MultiLisp 语言中的 future 结构;芭芭拉·利斯科夫(Barbara Liskov)等人在 Argus 语言中提出了 promise。如今它几乎无处不在:JavaScript 的 Promise 与 async/await、Java 的 CompletableFuture、Python 的 asyncio.Future、C++ 的 std::future、Scala 与 Rust 的 Future 都是该模式的落地。
该模式适用于网络请求、磁盘读写、远程调用等一切耗时操作:前端并发拉取多个接口后聚合渲染;服务端用异步客户端同时调用多个下游服务,再合并结果,显著缩短总延迟并减少线程占用。
问:Future 和 Promise 到底谁是谁?答:习惯上 Future 指消费结果的一端,Promise 指生产结果的一端;但各语言命名并不统一,例如 JavaScript 只有 Promise 一个对象同时承担两种角色。
问:阻塞式地 get 一个 Future 有什么问题?答:这会让调用线程原地等待,抵消异步的意义,在线程池或事件循环中阻塞等待还可能导致饥饿甚至死锁,应优先使用回调组合或 await。

| 英文名 | Futures and Promises |
| 概念起源 | 1977 年 Baker 与 Hewitt |
| 早期实现 | MultiLisp、Argus |
| 现代实现 | JS Promise、CompletableFuture |
| 配套语法 | async/await |
登录 后参与讨论
暂无讨论,来发表第一条评论吧