Ruby Ractors 与 Python 的 MultiProcessing 模块相同吗?
Are Ruby Ractors the Same as Python's MultiProcessing module?
Ruby 3.0 版本引入了 Ractors 以及它们在示例中的表示方式,让人想起 Python 的多处理模块。
所以...
Ruby 的 Ractors 只是伪装的多个进程,而 GIL 仍在统治线程吗?
如果不是,您能否提供一个示例,说明 Ractors 在速度和通信延迟方面均优于 MultiProcessing?
Ractors 能否像 C/C++ 线程一样快且延迟低?
谢谢
我在 FastRuby 的网站上找到了一个 article,它解释了 Ractors 与 Ruby 的其他并发和并行特性之间的区别。
关键在于,它们还不够快(2020 年 12 月 30 日),到目前为止还落后 fork
甚至 threads
。所以到目前为止的答案是:
否
不幸的是,还没有 (30/12/2020)
没有(话又说回来,还没有!但如果他们最终可以的话我真的很高兴)
- 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 不共享任何数据,所以根本没有什么可以锁定的。
- 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是一种具有特定语言语义的语言特征。
- Can Ractors be as fast as C/C++ threads and with low latency?
不太清楚你的意思。 C 没有线程,所以询问 C 线程没有意义。 C++ 有线程,但就像 Ractors 一样,它们只是一个具有多种可能实现的规范。它仅取决于 Ractors 和 C++ 线程的特定实现。
当然可以使用线程来实现 Ractors。当前的 YARV 原型就是证明。
Ruby 3.0 版本引入了 Ractors 以及它们在示例中的表示方式,让人想起 Python 的多处理模块。
所以...
Ruby 的 Ractors 只是伪装的多个进程,而 GIL 仍在统治线程吗?
如果不是,您能否提供一个示例,说明 Ractors 在速度和通信延迟方面均优于 MultiProcessing?
Ractors 能否像 C/C++ 线程一样快且延迟低?
谢谢
我在 FastRuby 的网站上找到了一个 article,它解释了 Ractors 与 Ruby 的其他并发和并行特性之间的区别。
关键在于,它们还不够快(2020 年 12 月 30 日),到目前为止还落后 fork
甚至 threads
。所以到目前为止的答案是:
否
不幸的是,还没有 (30/12/2020)
没有(话又说回来,还没有!但如果他们最终可以的话我真的很高兴)
- 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 不共享任何数据,所以根本没有什么可以锁定的。
- 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是一种具有特定语言语义的语言特征。
- Can Ractors be as fast as C/C++ threads and with low latency?
不太清楚你的意思。 C 没有线程,所以询问 C 线程没有意义。 C++ 有线程,但就像 Ractors 一样,它们只是一个具有多种可能实现的规范。它仅取决于 Ractors 和 C++ 线程的特定实现。
当然可以使用线程来实现 Ractors。当前的 YARV 原型就是证明。