问题描述
有不同的并发范式:
- Promises and Futures
- Actors and Tasks
- Async/Await
- 也许更多,找不到最终列表
在我未经训练的眼睛看来,这些都做同样的事情。如果它们都可用,我什么时候应该使用一个而不是另一个?它们兼容吗?它们可以一起使用吗?
解决方法
异步编程有着悠久的历史。大部分历史都充满了回调或事件,很难编程。
Promises/Futures 带来的最大好处是异步操作现在由单个对象表示,该对象具有自己的回调/通知列表。这修复了旧的基于回调/基于事件的异步编程风格的大多数问题,但在编写循环(例如,指数重试)等代码时仍然很尴尬。
async
/await
通过添加更方便的语法建立在 Promises/Futures 之上;有了 async
/await
,异步方法终于几乎和同步方法一样简单了。大多数 async
实现都建立在 Promise 之上(例如,JavaScript 中的 Promise
、C# 中的 Task<T>
、Python 中的 asyncio.Future
、Rust 中的 Future
trait)。
演员是完全不同的东西。 Actors 更多的是关于分布式编程,Actor 可以在任何机器上运行并有自己的错误恢复等。 最初的 OOP 思想非常类似于 Actor(将“消息”发送到可能是远程的“实例”),但是这些天 OOP 已经形成一个概念,它们被限制在同一个本地进程中。 Actor 在某些方面代表了原始 OOP 思想的复活。
就使用指南而言,我推荐 async
/await
而不是 Futures/Promises,因为它是同一想法(异步编码模式)的进一步演变。 Actor 是一种解决不同问题的不同技术,所以我会说只有在需要时才使用它们。