2012-05-23 34 views

回答

5

稀土元素是源自MRI 1.8.7。因此,它只使用綠色線程。 REE改變了1.8.7的某些部分(特別是在內存管理和垃圾收集方面)。但它仍然廣泛地遵循上游MRI的設計(原始Matz的Ruby解釋器)

雖然YARV(1.9)切換到OS本地線程,但它們仍然具有全局解釋器鎖,確保只有其中一個線程運行一次。

有幾個Ruby實現與OS本機線程和沒有GIL。最突出的是JRuby(基於JVM)和Rubinius(擁有自己的VM)。這些實現提供了「真正的」併發線程。

+0

+1,但我想指出,使用Ruby線程時,GIL並不總是有效。因此,使用線程通常會*有意義,即使它與GIL之類的概念相反也是非常直觀的。 – emboss

+0

那麼,用GIL,你仍然可以建立「併發」序列的模型。因此,雖然每條指令只能一個接一個地執行,但代碼流(或序列)是併發的。這使得EventMachine等事物即使在GILed實現上也非常有效。 –

5

除了JRuby和Rubinius,他們完全擺脫了翻譯鎖定之外,CRuby/MRI的狀態在併發性方面也取得了一些進展。

一個顯着特點是與Bitmap Marking GC通過Narihiro村,像Ruby 2.0的,REE在CRuby的另一個優勢將不復存在:稀土有這使得它通過流程實現併發吸引力寫友好的GC算法副本(分叉)而不是通過線程。新的位圖標記GC在分叉新程序時將有保存不必要的內存複製的same advantage

GIL(或正式命名的GVL)也不像起初聽起來那麼糟糕。例如,Ruby釋放解釋器鎖when doing IO。我們最近經常看到的另一個特性是,C擴展開發人員可以通過調用rb_thread_blocking_region來手動釋放鎖,它將在GIL發佈時執行C級函數。如果要執行C中的一些操作,我們可以確信它沒有副作用,這可能會產生巨大的影響。一個很好的例子是RSA key generation - 它完全在C中運行,由OpenSSL分配內存,所以我們可以在GIL發佈的時候安全地運行它。

1.9或近期的項目(如Celluloid)中引入的纖維與今年相比,也更加友好地闡述了Ruby併發性的狀態。

最後同樣重要的是,CRuby的VM的作者Koichi Sasada正在積極研究MVM技術,這將允許在單個Ruby進程中運行多個VM,從而以另一種方式實現併發。

考慮到所有其他性能改進,使用稀土元素的爭論越來越少,一旦缺失就可以安全地切換到1.9.3或2.0.0,特別是因爲1.8系列將不再積極開發許多受歡迎的項目已經宣佈不久將支持1.8版本。

編輯:

由於霍爾格指出,REE也已經EOLed,並且不會有任何端口到1.9或進一步。所以它不僅是安全的切換,而且是正確的事情:)

+2

+1。可以補充的是,[REE正式宣佈](http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-迫在眉睫/)並且不會移植到1.9系列。 –

+0

@HolgerJust是的,好點。不僅切換安全,而且實際上是正確的做法:)我會添加您的評論。 – emboss

+1

偉大的信息,但它並沒有真正回答這個問題。 – echristopherson