代码之家  ›  专栏  ›  技术社区  ›  Jesse Jashinsky

Ruby纤维可以并发吗?

  •  12
  • Jesse Jashinsky  · 技术社区  · 14 年前

    threads = []
    
    threads << Thread.new {Do something}
    threads << Thread.new {Do something}
    
    threads.each {|thread| thread.join}
    

    我不知道怎么用纤维做这种事。我能找到的就是 yield resume

    3 回复  |  直到 12 年前
        1
  •  16
  •   Jörg W Mittag    14 年前

    不,您不能与 Fiber s。 纤维 Exception s。这就是问题所在 整点 纤维 学生:他们 从未 并行运行,它们是协作的,并且是确定性的。 纤维 我们是合作伙伴(事实上,我一直不明白为什么他们不被简单地称为 Coroutine s、 ()

    Ruby中唯一的并发构造是 Thread .

        2
  •  13
  •   Community TheSoundDefense    7 年前

    在并发性和并行性之间似乎存在一个术语问题。

    我认为你实际上谈论的是并行性,而不是并发性:

    并发 两个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。在单核机器上进行多任务处理。 平行度 任务实际上是同时运行的,例如在多核处理器上

    Concurrency vs Parallelism - What is the difference?

    这里也有很好的说明: http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

    所以要回答这个问题:

    纤程是在Ruby中实现轻量级协作并发的原语。

    http://www.ruby-doc.org/core-2.1.1/Fiber.html

    但这并不意味着它可以并行运行。

        3
  •  1
  •   rogerdpack    6 年前

    如果您想要真正的并发性,那么您需要将线程与jruby一起使用(jruby实际上没有纤程,它只有线程,每个纤程一个)。

    另一种选择是“分叉”到新的进程,这些进程可以在MRI上真正并行地运行。