我(重新)在ruby中编写套接字服务器以期简化它。阅读关于ruby套接字我在site上跑过来说,多线程ruby应用程序只在一台机器中使用一个核心/处理器。
问题:
答案 0 :(得分:5)
CRuby有global interpreter lock,因此无法并行运行线程。 Jruby和其他一些实现可以做到这一点,但是CRuby永远不会并行运行任何类型的代码。这意味着,无论您的操作系统多么智能,它都无法共享负载。
这与C ++中的线程不同。 pthreads创建真正的OS线程,而核心调度程序将同时在多个核心上运行它们。从技术上讲,Ruby也使用pthread,但GIL阻止它们并行运行。
Fork创建了一个新进程,您的操作系统的调度程序几乎肯定足够聪明,可以在一个单独的核心上运行它。如果你需要Ruby中的并行性,要么使用没有GIL的实现,要么使用fork。
答案 1 :(得分:2)
由于YARV中的GIL,ruby不是线程友好的。如果你想写多线程红宝石使用jruby或rubinius。使用具有actor模型的函数语言(如Erlang或Elixir)会更好,让虚拟机处理线程,您只管理Erlang进程。
答案 2 :(得分:1)
有一个名为parallel的非常好的宝石,它允许通过分叉进行数据处理(使用并行线程或多个进程)(解决当前CRuby实现的GIL)。
答案 3 :(得分:0)
如果您想要多核线程,则需要使用主动使用多个核心的解释器。 MRI Ruby从2.1.3开始仍然只是单核; JRuby和Rubinius允许访问多个核心。
更改翻译的替代方法包括: