2012-07-08 80 views
6

據我所知,Ruby 1.9使用操作系統線程,但只有一個線程仍然實際上併發運行(儘管一個線程可能在阻塞IO而另一個線程正在處理)。我見過的線程示例只是使用Thread.new來啓動一個新線程。從Java背景來看,我通常使用線程池,因爲它們「重量級」,因此不會啓動到許多新線程。Ruby 1.9線程池

是否有線程池構造內置到紅寶石?我沒有在默認語言庫中看到一個。或者是否有通常使用的標準寶石?由於操作系統級別的線程是ruby的一個新特性,我不知道它有多成熟。

回答

6

你是正確的,因爲默認的C Ruby解釋器一次只執行一個線程(其他基於C的動態語言,比如Python也有類似的限制)。由於這個限制,線程在Ruby中並不常見,因此沒有默認的線程池庫。如果有任務需要並行完成,人們通常會使用進程,因爲進程可以擴展到多臺服務器。

如果您確實需要使用線程,我建議您在JRuby平臺上使用https://github.com/meh/ruby-threadpool,這是一個在JVM上運行的Ruby解釋器。這應該是你的衚衕,因爲它在虛擬機上運行,​​它將具有真正的線程。

+0

謝謝。我現在實際上並沒有用例,但是當我正在閱讀鎬書時,這是我不確定的,但是你已經澄清了。 – 2012-07-09 15:32:40

+12

我不明白,當人們提到線程在Ruby中沒用時,因爲它們並不是同時運行的。對於CPU綁定任務來說,它們確實沒有用處,但它們對於任何想要並行執行的阻塞IO都非常有用。例如。併發HTTP請求。 – Kamchatka 2013-03-03 20:03:40

+0

感謝您的評論。我需要進一步闡明線程在Ruby中沒有用處,只是人們需要知道GIL的侷限性,因爲線程不是沒有開銷。對於非阻塞IO,基於事件C的異步調用可能更合適。有關更多信息,請參閱http://blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3。 – Wulfram 2013-03-04 18:50:18