为什么Ruby没有内置线程池?

7
我有一个程序,一次性创建了10000个线程,并同时运行8个线程。
但是Ruby没有像Java那样内置线程池。这是有充分的理由吗?

是的,我在想类似于Java的ExecutorService。 - JohnMerlino
3个回答

21

可能是因为使用标准库中的 "Queue" 类很容易自己实现。

q = Queue.new
3.times { Thread.new {  while something = q.pop(true) rescue nil; ... }

不过这是一个好问题,我建议你将其提出给Ruby核心团队。


3
我的猜测是,线程池在基于C的Ruby实现中并不是很有用。在Matz的Ruby解释器或另一个Ruby虚拟机中一次只能使用一个处理器。
如果您想要在多个处理器上运行多个线程,您需要使用JRuby。

2

很可能的原因是因为Ruby没有“真正”的线程。它拥有所谓的绿色线程。Ruby解释器负责调度执行线程,而不使用任何底层操作系统线程。这实际上使得Ruby是单线程的。


2
尽管YARV(即Ruby 1.9)一次只使用一个CPU,但我认为它并不使用绿色线程。 - Andrew Grimm
3
绿色线程并不会使线程池变得无用。一个线程可能在等待程序外部的某些东西,此时另一个线程可以被调度。使用绿色线程通常(或者说经常)比顺序处理更加高效。 - Kelvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接