Ruby 1.9线程池

时间:2012-07-08 17:48:05

标签: ruby multithreading threadpool

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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

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

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