Ruby – 如何跨核心/处理器进行线程化

我(重新)在ruby中编写套接字服务器以期简化它。 阅读ruby套接字我跑过一个网站 ,说multithreadingruby应用只在一台机器上使用一个核心/处理器。

问题:

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

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

这与C ++中的线程不同。 pthreads创建真实的OS线程,而核心的调度程序将同时在多个核心上运行它们。 从技术上讲,Ruby也使用pthread,但GIL阻止它们并行运行。

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

由于YARV中的GIL ,ruby不是线程友好的。 如果你想写multithreadingruby使用jruby或rubinius。 使用具有actor模型的函数语言(如Erlang或Elixir)会更好,让虚拟机处理线程,您只管理Erlang进程。

有一个非常好的gem叫做parallel ,它允许通过分叉进行数据处理(通过分支线程或多个进程进行数据处理)(解决当前CRuby实现的GIL问题)。

穿线

如果您想要多核线程,则需要使用主动使用多个核心的解释器。 MRI Ruby从2.1.3开始仍然只是单核; JRuby和Rubinius允许访问多个核心。

线程替代品

更改翻译的替代方法包括:

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