我正在用 Ruby 重新编写一个套接字服务器,希望简化它。在阅读有关 Ruby 套接字的文章时,我发现了一个网站,该网站称多线程 Ruby 应用程序只使用机器中的一个核/处理器。
问题:
- 这准确吗?
- 我需要在意吗?此服务器中的每个线程可能运行几分钟,并且会有很多线程。操作系统(CentOS 6.5)是否足够智能以共享负载?
- 这与 C++ 中的线程有什么不同?(当前套接字服务器的语言)即 pthreads 是否自动使用多个核心?
- 如果我使用 fork 而不是 thread 会怎样?
我正在用 Ruby 重新编写一个套接字服务器,希望简化它。在阅读有关 Ruby 套接字的文章时,我发现了一个网站,该网站称多线程 Ruby 应用程序只使用机器中的一个核/处理器。
问题:
CRuby有一个全局解释器锁, 因此它不能并行运行线程。Jruby和其他一些实现可以做到这一点,但CRuby永远不会并行运行任何类型的代码。这意味着,无论您的操作系统多么聪明,它都无法共享负载。
在C++中,线程与之不同。pthreads创建真正的操作系统线程,内核的调度程序将同时在多个核上运行它们。从技术上讲,Ruby也使用pthreads,但GIL阻止它们并行运行。
Fork创建一个新进程,您的操作系统调度程序几乎肯定足够聪明,以在单独的核心上运行它。如果您需要Ruby中的并行性,请使用没有GIL的实现,或使用fork。
由于YARV中的GIL,Ruby不适合多线程。如果您想编写多线程的Ruby代码,请使用JRuby或Rubinius。更好的选择是使用Actor模型的函数式语言,如Erlang或Elixir,让虚拟机处理线程,您只需管理Erlang进程。
如果你想要多核线程,你需要使用一个能够主动使用多个核心的解释器。截至2.1.3版本,MRI Ruby仍然只支持单核;JRuby和Rubinius允许访问多个核心。
改变解释器的替代方案包括: