【问题标题】:Ruby - how to thread across cores / processorsRuby - 如何跨内核/处理器线程
【发布时间】:2014-10-27 00:19:57
【问题描述】:

我(重新)用 ruby​​ 编写一个套接字服务器,希望能简化它。在阅读有关 ruby​​ 套接字的信息时,我遇到了一个 site,它说多线程 ruby​​ 应用程序仅在机器中使用一个内核/处理器。

问题:

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

【问题讨论】:

    标签: ruby multithreading sockets


    【解决方案1】:

    CRuby 有一个global interpreter lock,所以它不能并行运行线程。 Jruby 和其他一些实现可以做到这一点,但 CRuby 永远不会并行运行任何类型的代码。这意味着,无论您的操作系统多么智能,它都无法分担负载。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • MRI 没有 GIL。 YARV 有 GIL,但 MRI 不需要。 MRI 具有由解释器本身安排的绿色线程。解释器无论如何都不能同时调度两个线程,所以没有必要锁定任何东西。
        【解决方案4】:

        线程

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

        线程替代

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-28
          • 1970-01-01
          • 2015-01-04
          • 2016-01-17
          • 1970-01-01
          • 2016-04-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多