2010-05-14 43 views
15

在我看來,自從this famous thread以來,Ruby社區一直在關注自動加載,因爲線程安全原因而不鼓勵使用它。在Ruby 1.9中自動加載線程安全嗎?

有誰知道這不再是Ruby 1.9.1或1.9.2中的問題嗎?我已經看到關於互斥需求的一些話題,但1.9版本的更新(至少和我已經找到的一樣)似乎並沒有解決這個特定的問題。我想知道我是否可以在沒有任何合理的悲傷的情況下合理開始自動加載1.9以上的庫。

在此先感謝您的任何見解。

+1

「這個着名的線程」鏈接被打破 – 2016-07-07 19:43:24

回答

7

我不知道一般情況下,但該線程攝製例子並不在1.9.1破解:

autoloaded.rb:

sleep 1 
Bar::Foo = 1 

autoloader.rb:

module Bar 
    autoload :Foo, 'autoloaded.rb' 
end 

t1 = Thread.new { Bar::Foo } 
t2 = Thread.new { Bar::Foo } 
t1.join; t2.join 
+2

D'oh。爲什麼哦爲什麼我沒有想到這一點?在自己複製並嘗試了一些壓力測試變體(並且確認RVM在1.8.7中仍未破解,JRuby和Rubinius - 除** 1.9.1和1.9.2之外的所有內容**)之後,我打電話給我這回答了。謝謝! – SFEley 2010-05-15 17:11:33

+0

我很驚訝它在JRuby中不是線程安全的 - 我認爲線程安全是他們的目標之一。 – 2010-05-16 23:08:32

-4

它總是壞了。

subload允許您在線程環境中切換模式。

我仍然在線程環境中使用自動加載,但只在單線程啓動序列中使用。我沒有看到在真實世界的應用程序中擁有多線程啓動過程的充分理由。如果你確實有一個,你可能會需要排隊加載共享庫的行動,你將總是有類和實例級別設置線程安全問題,大多數partuclarly的東西,如:

class Lib 
    extend SomeClassFuncs 
    do_something_with_class_funcs 
end 

此代碼是不線程安全的加載時間,無論裝載機。

如果你看不到這個,你不應該穿線。

+0

Subload?什麼是子載入? - 我確實看到了你的觀點,但正如你所指出的那樣,這種元編程與'autoload'一樣是''require'線程不安全的。我的問題是,前一段時間由Charles Nutter記錄的'autoload'中的特定錯誤是否已經在Ruby 1.9中得到解決,並且已經得到解決。 – SFEley 2010-06-15 15:58:11

+0

Subload是https://github.com/raggi/subload – raggi 2011-03-06 10:58:04

+0

自動加載線程安全錯誤無法修復。只有一些情況可以調整。 – raggi 2011-03-06 10:58:32

9

2011年更新,因爲我也很好奇。目前

兩張票被打開:

的核心開發者建議,需要和以同樣的方式自動加載工作,是線程安全的,在CRuby/JRuby的1.9 。這是紅寶石在文件完全加載之前保持鎖定的意義。

然而,這引入了潛在的死鎖,不便的副作用。具體做法是:

  1. 的Th1負載A和鎖它
  2. Th2的負載B和鎖定它
  3. 的Th1試圖加載B中裝載的一部分,開始等待的Th2
  4. Th2的嘗試加載A作爲部分加載B,開始等待Th1
  5. 死鎖...

結論可能是:如果在您的應用程序中有任何潛在的死鎖,則需要在啓動線程之前需要的所有內容。

+0

想要B,B想要A,是一種輕微的代碼味道? – 2011-07-02 13:11:20

+1

我可以想象這種事情發生在一個線程服務器上,它的初始頁面加載觸發了大量的自動加載。以上兩個線程實際上提到了這種情況。 – 2011-07-02 13:20:21

+2

除此之外,值得注意的是,無論ruby線程是否安全,[event-machine都不是線程安全的](https://github.com/eventmachine/eventmachine/issues/97)。考慮到瘦身和巨人都是以此爲基礎的,並且雜種和webrick都不使用線程,並且mod_rack依賴於雜種/ webrick工作者,所以在一天結束時它並不重要。 ;-) – 2011-07-02 13:24:13