ruby-并发中的承诺或未来?什么时候应该使用哪个?

Promise or Future in ruby-concurrency? When should be used which?

一般来说,promises 和 features 是密切相关的,如果不是同义词的话。在 gem https://github.com/ruby-concurrency 的文档中,它也是如此。因此,在什么情况下应该使用哪一个是令人困惑的。它们在 gem 中有什么关系?其中一个级别比另一个低或过时吗?他们基本上都做同样的事情吗?

此外,这些的存在使它更加混乱:

* Concurrent::Promises.future
* Concurrent::Promises::Future
* Concurrent::Future
* [...possibly something similar...]

简而言之,Future是关于异步执行的。它是对系统线程的高级抽象 (Ruby Thread class)。所以当你需要加速和并行化一些计算时,你需要使用线程。但它是某种低级的东西,所以使用 Futures 更容易。好处之一是 Futures 的实现通常使用线程池,因此您可以管理并发级别和系统资源消耗。所以Future解决的问题是low-level线程并发模型的复杂性。

另一方面,Promise是关于建筑和构图的。与并发无关。它是对回调的高级抽象,是 Observer 模式的子类型。它允许解耦产生某些结果的组件 和消耗此结果的组件。生产者和消费者可能对彼此一无所知。所以 Promise 解决的问题是回调方法带来的复杂性和耦合性。

所以,关于concurrent-ruby。他们提供 PromiseFuture 的 classic 版本。但现在他们还提供了一个新的 API - Promises(最后是 s),看起来就像是 promises 和 futures 的组合,带有统一的 API。它实现(实际上重用)PromiseFuture 库,但在它们之上提供了一些新接口。例如 future 的行为类似于 promise 并允许注册回调并且可以像 promises 一样被链接起来。