7

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

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

4

2 回答 2

7

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

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

于 2012-07-09T09:05:10.507 回答
1

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

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

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

于 2018-09-05T08:51:15.473 回答