2014-10-02 7 views
6

Der Code:eine Klassenmethode in mehreren Threads Referenzierung führt automatisch geladen zirkuläre Abhängigkeit Absturz

threads = [] 
Thread.abort_on_exception=true 
begin # throw exceptions in threads so we can see them 
    threads << Thread.new{@a = MyClass.m1} 
    threads << Thread.new{@b = MyClass.m2} 
    threads << Thread.new{@c = MyClass.m3} 

    threads.each { |thr| thr.join } 
rescue Exception => e 
    puts "EXCEPTION: #{e.inspect}" 
    puts "MESSAGE: #{e.message}" 
end 

Der Absturz:

.rvm/gems/[email protected]/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:in load_missing_constant': Circular dependency detected while autoloading constant MyClass

Nach einem wenig zu graben, scheint es, dass da jedes Thema ist Referenzierung MyClass, verursacht einen Fehler beim automatischen Laden von Ruby. Wenn ich eine einzelne Zeile mit einem Verweis auf MyClass hinzufüge, bevor ich den Thread aufruft, scheint es den Fehler zu verhindern.

Meine Frage ist, gibt es eine "richtige" Möglichkeit, dies zu verhindern, oder ist es ein Fehler in Ruby? Mein Verständnis war, dass die automatische Laden war Thread-sicher, pro http://blog.plataformatec.com.br/2012/08/eager-loading-for-greater-good/

+0

Rails 4.1.5 Ruby 2.1.3 –

+0

kommentieren Nur weil ich diese folgen wollen. :) – baash05

+0

Was hast du endlich gemacht? –

Antwort

0

Rubin ein Problem mit Threadedautoload und sogar require für diese Angelegenheit zu haben, verwendet. Es wurde in ruby 2.0 behoben, siehe hierzu bug on ruby-lang.org.

Rails kann nach wie vor den Bug [Kreisabhängigkeitsfehler mit lib Klassen] (Circular Abhängigkeitsfehler mit lib Klassen)

Jede Art und Weise des Update einfach ist das Symbol erfordern oder verweisen, bevor es in das Gewinde zu werfen.

require 'myclass' 

oder

defined? MyClass