除此之外,解释器全局锁的存在也阻止了代码的并行执行,即使在多核系统上也是如此。此时,想象一个 ruby on Rails 应用程序,同时管理多个请求的唯一方法是拥有多个实例,并进一步使用内存。 JavaScript 继续以 Web 应用程序为例,NodeJS 能够同时处理多个请求,利用它是使 日本手机号码 用反应器模式实现的,完全使用非阻塞调用。 但是,不存在并行性问题,并且单个阻塞调用(可能在某些外部库中)可能会阻塞所有请求,从而危及整个应用程序的功能。与 Ruby 的 MRI 实现一样,实现真正并行性的唯一方法是加载应用程序的多个实例。 去 在 Go 中情况则非常不同。该语言的特点之一是goroutine的存在,即能够与其他函数同时执行的函数。
启动起来就像一个关键字一样简单。 Go 运行时包含一个调度程序,用于协调任意数量的 goroutine 在任意数量的系统线程上的执行(M:N 模型)。这样,在使用所有CPU核心的同时获得快速的上下文切换。因此,在一个用 Go 编写的假设 Web 应用程序中,即使其中一个进程正在执行阻塞操作,单个进程也能够继续服务请求。标志 选择哪一个? Ruby 与 Web 框架相结合,非常适合原型设计,让您可以在很短的时间内获得工作模型。但不幸的是,它存在可扩展性问题。 NodeJS 在性能方面比 Ruby 领先一步,但它没有可比的框架。此外,我们必须考虑是否容易犯下危及应用程序正常运行的错误。 Go 的表现力当然不如 Ruby 和 Javascript,这是一个年轻且快速发展的生态系统,但它在性能方面具有不可忽视的优势。