Ruby Ractor和解释语言中的并行性 Ractor Ruby 3.0 的主要特性之一是引入了“ractor”。 Ractor 是 Ruby 的一个新的并发抽象。 与 Ruby 线程不同,ractor 可以并行运行。 由于 Ruby 全局虚拟机锁(GVL),即使每个 Ruby 线程都映射到本地线程,也只能有一个活动线程在运行。 但是引入 ractor 后,可以有多个 GVL,每个 ractor 有一个。 这就是 ractor 可以并行执行的原因。 ractor 的引入使 Ruby 能够实现真正的并行性,同时使用一个解释器。 在我们深入研究 ractor 实现之前,我想首先谈谈为什么 Ruby 有 GVL。 Global VM Lock Python 中的 GVL 或 GIL(全局解释器锁)。它是一种解释器范围的锁,可确保在任何给定时间只有一个线程正在执行。它的存在是为了方便解释器的开发。要理解为什么只有解释型语言有这个而其他语言没有,我们需要知道解释器是做什么的。 Ruby 允许动态添加类/模块的实例/类变量,它将这些信息存储在一个表中。现在,如果两个线程正在修改这个表,就会发生数据竞争。解释器所做的另一件事是垃圾收集。关于垃圾收集的信息存储在“对象空间”中,垃圾收集器将遍历这个空间,删除每个未被引用的对象。现在,如果一个线程触发垃圾收集器但另一个线程仍在创建对象,数据竞争也会发生。 所以如果你有GVM,就不用担心上面的问题了。像 Java 这样的语言不允许在运行时修改类变量。而且关于垃圾收集的信息并不存储在一个集中的空间中,它单独存储在每个对象本身上。 在Ractor之前的并发实现 为了实现并行性,Ruby on Rails 产生了几个新的 Ruby 进程。 因为每个 Ruby 进程都有自己的 GVL。 但是我们现在有多个解释器,这使得我们的程序效率低下。 同样,Python 的 Flask 也使用这种方法。 至于 Node.js,它也催生了新的 Js 引擎。 但是 Js 没有 GVL,因为它没有线程。 ...