Ruby-如何跨内核/处理器线程



Im(re)在ruby中编写了一个套接字服务器,希望能简化它。在阅读关于ruby套接字的文章时,我遇到了一个网站,上面说多线程ruby应用程序在一台机器中只使用一个核心/处理器。

问题:

  1. 这准确吗
  2. 我在乎吗?这个服务器中的每个线程可能会运行几分钟,而且会有很多线程。操作系统(CentOS 6.5)是否足够智能,可以共享负载
  3. 这与C++中的线程有什么不同吗?(当前套接字服务器的语言)IE是否pthread自动使用多个内核
  4. 如果我分叉而不是线程,该怎么办

CRuby有一个全局解释器锁,因此它不能并行运行线程。Jruby和其他一些实现可以做到这一点,但CRuby永远不会并行运行任何类型的代码。这意味着,无论你的操作系统多么智能,它永远无法分担负载。

这与C++中的线程不同。pthreads创建真正的操作系统线程,内核的调度器将同时在多个内核上运行它们。从技术上讲,Ruby也使用pthread,但GIL阻止它们并行运行。

Fork创建了一个新进程,您的操作系统的调度程序几乎肯定足够智能,可以在单独的内核上运行它。如果您需要Ruby中的并行性,可以使用不带GIL的实现,也可以使用fork.

有一个非常好的gem称为parallel,它允许通过分叉使用并行线程或多个进程进行数据处理(围绕当前CRuby实现的GIL工作)。

由于YARV中的GIL,ruby对线程不友好。如果您想编写多线程ruby,请使用jruby或rubinius。更好的做法是使用带有actor模型的函数式语言,如Erlang或Elixir,让虚拟机处理线程,而您只管理Erlang进程。

线程

如果你想要多核线程,你需要使用一个积极使用多核的解释器。截至2.1.3,MRI Ruby仍然是唯一的单核;JRuby和Rubinius允许访问多个内核。

线程替代方案

更换口译员的替代方案包括:

  • 具有多个Ruby进程的DRb
  • 有多个工人的排队系统
  • 带有多个解释器的套接字编程
  • 如果底层平台支持fork(2)系统调用,则分叉进程

最新更新