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