Ruby - 如何在多核处理器上进行线程编程

8

我正在用 Ruby 重新编写一个套接字服务器,希望简化它。在阅读有关 Ruby 套接字的文章时,我发现了一个网站,该网站称多线程 Ruby 应用程序只使用机器中的一个核/处理器。

问题:

  1. 这准确吗?
  2. 我需要在意吗?此服务器中的每个线程可能运行几分钟,并且会有很多线程。操作系统(CentOS 6.5)是否足够智能以共享负载?
  3. 这与 C++ 中的线程有什么不同?(当前套接字服务器的语言)即 pthreads 是否自动使用多个核心?
  4. 如果我使用 fork 而不是 thread 会怎样?
4个回答

10

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

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

Fork创建一个新进程,您的操作系统调度程序几乎肯定足够聪明,以在单独的核心上运行它。如果您需要Ruby中的并行性,请使用没有GIL的实现,或使用fork。


2

有一个非常好用的 gem 叫做 parallel,它允许使用并行线程或多个进程进行数据处理,通过分叉来解决当前 CRuby 实现中的 GIL 限制。


1

由于YARV中的GIL,Ruby不适合多线程。如果您想编写多线程的Ruby代码,请使用JRuby或Rubinius。更好的选择是使用Actor模型的函数式语言,如Erlang或Elixir,让虚拟机处理线程,您只需管理Erlang进程。


1
MRI没有GIL。YARV有GIL,但是MRI不需要。MRI有绿色线程,由解释器本身进行调度。解释器无法同时调度两个线程,因此不需要锁定任何内容。 - Jörg W Mittag

0

线程

如果你想要多核线程,你需要使用一个能够主动使用多个核心的解释器。截至2.1.3版本,MRI Ruby仍然只支持单核;JRuby和Rubinius允许访问多个核心。

线程替代方案

改变解释器的替代方案包括:

  • DRb与多个Ruby进程。
  • 具有多个工作进程的队列系统。
  • 使用多个解释器进行套接字编程。
  • 如果底层平台支持fork(2)系统调用,则可以分叉进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接