如何比较不同的并发范例?

How do the different concurrency paradigms compare?

有不同的并发范例:

在我外行看来,这些都是做同样的事情。如果它们都可用,我应该什么时候使用一个而不是另一个?它们兼容吗?它们可以一起使用吗?

异步编程有着悠久的历史。大部分历史记录都充满了很难编程的回调或事件。

带来的最大好处 Promises/Futures 是异步操作现在由单个对象表示,该对象具有 自己的 callbacks/notifications 列表。这解决了旧 callback/event-based 异步编程风格的大部分问题,但在编写循环(例如,指数重试)之类的代码时仍然很尴尬。

async/await 在 Promises/Futures 的基础上添加了更方便的语法;使用 async/await,异步方法终于几乎和同步方法一样简单了。大多数 async 实现都基于承诺(例如,JavaScript 中的 Promise、C# 中的 Task<T>、Python 中的 asyncio.FutureFuture Rust 中的特征)。

演员是一种完全不同的东西。 Actor 更多的是关于分布式编程,其中一个 actor 可以 运行 在任何机器上并且有自己的错误恢复等。最初的 OOP 思想非常像 Actor(将“消息”发送到可能是远程的“实例” ),但现在 OOP 已经融入了一个概念,即它们被限制在同一个本地进程中。 Actor 在某些方面代表了原始 OOP 思想的复兴。

就使用指南而言,我建议 async/await 而不是 Futures/Promises,因为它是同一思想(异步编码模式)的进一步发展。 Actor 是解决不同问题的不同技术,所以我会说只有在需要时才使用它们。