【问题标题】:Ruby 1.9 thread poolsRuby 1.9 线程池
【发布时间】:2012-07-08 06:36:12
【问题描述】:

据我了解,Ruby 1.9 使用 OS 线程,但实际上只有一个线程仍会同时运行(尽管一个线程可能正在阻塞 IO,而另一个线程正在处理)。我见过的线程示例只是使用Thread.new 来启动一个新线程。来自 Java 背景,我通常使用线程池来避免启动许多新线程,因为它们是“重量级”。

ruby 中是否有内置的线程池结构?我在默认语言库中没有看到。或者是否有通常使用的标准宝石?由于操作系统级别的线程是 ruby​​ 的一个较新的特性,我不知道它的库有多成熟。

【问题讨论】:

    标签: ruby multithreading threadpool


    【解决方案1】:

    接受的答案是正确的,但是,有很多任务可以使用线程。毕竟它的存在是有原因的。即使它一次只能运行一个线程。在许多现实生活中,它仍然可以被认为是并行的。

    例如,当我们有 100 个长时间运行的进程时,每个进程大约需要 10 分钟才能完成。通过在 ruby​​ 中使用线程,即使有所有这些限制,如果我们一次定义一个包含 10 个任务的线程池,它在没有线程的情况下运行速度将比 100*10 分钟快得多。示例包括,实时捕获文件更改,发送大量网络请求(例如状态检查)

    您可以通过阅读 https://blog.codeship.com/understanding-fundamental-ruby-abstraction-concurrency/ 了解池的工作原理。在生产代码中使用https://github.com/meh/ruby-thread#pool

    【讨论】:

      【解决方案2】:

      您是正确的,默认的 C Ruby 解释器一次只执行一个线程(其他基于 C 的动态语言,如 Python 也有类似的限制)。由于这个限制,线程在 Ruby 中并不常见,因此没有默认的线程池库。如果有任务要并行完成,人们通常会使用进程,因为进程可以在多个服务器上扩展。

      如果你确实需要使用线程,我建议你在 JRuby 平台上使用https://github.com/meh/ruby-threadpool,这是一个运行在 JVM 上的 Ruby 解释器。这应该是你的拿手好戏,因为它在虚拟机上运行,​​所以它会有真正的线程。

      【讨论】:

      • 谢谢。我现在实际上没有用例,但是当我阅读镐书时,我不确定这是什么,但你已经澄清了。
      • 我不明白人们提到线程在 Ruby 中是无用的,因为它们不是并发运行的。它们对于 CPU 密集型任务确实无用,但它们对于您想要并行执行的任何阻塞 IO 都非常有用。例如。并发 HTTP 请求。
      • 感谢您的评论。我需要进一步澄清线程在 Ruby 中并非无用,只是人们需要意识到 GIL 的局限性,因为线程并非没有开销。对于非阻塞 IO,基于事件 C 的异步调用可能更合适。请参阅blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3 了解更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 2011-02-19
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多