2014-10-02 10 views
6

Il codice:riferimento a un metodo Classe di diversi fili provoca autocaricamento dipendenza circolare dura

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 

L'arresto:

.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

Dopo scavando un po ', sembra che, poiché ciascuna filettatura fa riferimento MyClass, sta causando un errore con il caricamento automatico di ruby. Se aggiungo una riga singola con un riferimento a MyClass prima di effettuare le chiamate Thread, sembra che si tratti di impedire l'errore.

La mia domanda è, c'è un modo "corretto" per evitare che ciò accada, o è un bug in ruby? La mia comprensione era che era caricamento automatico thread-safe, per http://blog.plataformatec.com.br/2012/08/eager-loading-for-greater-good/

+0

Rails 4.1.5, Ruby 2.1.3 –

+0

Proprio commentando perché voglio seguire questa. :) – baash05

+0

Cosa hai fatto alla fine? –

risposta

0

Rubino usato per avere un problema con Threadedautoload e anche require per quella materia. È stato corretto in ruby 2.0 vedere questo bug on ruby-lang.org.

Rails può avere ancora il bug [errore di dipendenza circolare con le classi lib] (errore di dipendenza circolare con le classi lib)

In qualsiasi modo la correzione è quello di richiedere o fare riferimento al simbolo prima di gettarla nella filettatura semplicemente.

require 'myclass' 

o

defined? MyClass