Ruby Ractors 与 Python 的 MultiProcessing 模块相同吗?

Are Ruby Ractors the Same as Python's MultiProcessing module?

Ruby 3.0 版本引入了 Ractors 以及它们在示例中的表示方式,让人想起 Python 的多处理模块。

所以...

  1. Ruby 的 Ractors 只是伪装的多个进程,而 GIL 仍在统治线程吗?

  2. 如果不是,您能否提供一个示例,说明 Ractors 在速度和通信延迟方面均优于 MultiProcessing?

  3. Ractors 能否像 C/C++ 线程一样快且延迟低?

谢谢

我在 FastRuby 的网站上找到了一个 article,它解释了 Ractors 与 Ruby 的其他并发和并行特性之间的区别。

关键在于,它们还不够快(2020 年 12 月 30 日),到目前为止还落后 fork 甚至 threads。所以到目前为止的答案是:

  1. 不幸的是,还没有 (30/12/2020)

  2. 没有(话又说回来,还没有!但如果他们最终可以的话我真的很高兴)

  1. Are Ruby's Ractors just multiple processes in disguise and the GIL is still ruling over the threads?

Ractor 规范没有规定任何特定的实施策略。它肯定没有规定实施者必须使用 OS 进程。事实上,虽然这将是一个非常简单的实现,因为 OS 为您完成了所有艰苦的工作,但它也将是一个非常愚蠢的实现,因为 Ractors 本来就是轻量级的,OS进程通常不是。

所以,我希望每个实施者都会选择自己最有效的实施策略。例如,我希望 TruffleRuby 和 JRuby 的实现基于 Kilim 或 Project Loom,Opal 的实现基于 WebWorkers、Realms 和 Promises,Artichoke 的实现基于 Actix、Riker 或 Axiom,以及 maybe MRuby 的实现 might 甚至基于 OS 进程,因为 MRuby 专注于简单性。

此时此刻,不存在 任何 生产就绪的 Ractors 实现。事实上,不可能 Ractors 的生产就绪实现,因为 Ractor 规范本身仍处于实验阶段,因此尚未最终确定。

目前唯一存在的实现是 Koichi Sasada 的原始原型,目前随 YARV 3.0.0 一起提供。此实现 将 Ractors 实现为进程,而是将它们实现为 OS 线程。 YARV 没有 GIL,但它有一个 per-Ractor GVL。所以,一个Ractor只有一个线程可以同时运行,但是多个Ractor每个可以同时运行一个线程。

不过,这并不是一个非常优化的实现,只是一个原型。我希望 TruffleRuby 或 JRuby 的实现没有任何类型的全局锁。他们以前从来没有过,而且 Ractors 不共享任何数据,所以根本没有什么可以锁定的。

  1. If they aren't, could you provide an example in which Ractors have the upper hand against MultiProcessing in both speed and communication latency?

这种比较意义不大。首先,Ractor 是一个可能有多个实现的规范,而据我了解,Python 的多处理模块只是启动多个 Python 解释器的一种方式。

其次,Ractors是一种具有特定语言语义的语言特征。

  1. Can Ractors be as fast as C/C++ threads and with low latency?

不太清楚你的意思。 C 没有线程,所以询问 C 线程没有意义。 C++ 有线程,但就像 Ractors 一样,它们只是一个具有多种可能实现的规范。它仅取决于 Ractors 和 C++ 线程的特定实现。

当然可以使用线程来实现 Ractors。当前的 YARV 原型就是证明。