2010-05-14 18 views
15

Mi sembra che la comunità di Ruby stia impazzendo un po 'sul caricamento automatico dal this famous thread, scoraggiando il suo utilizzo per motivi di sicurezza dei thread.Il caricamento automatico del thread è sicuro in Ruby 1.9?

Qualcuno sa se questo non è più un problema in Ruby 1.9.1 o 1.9.2? Ho visto un po 'di parlare di wrapping richiede in mutex e così via, ma i 1.9 changelog (o almeno per quanto sono stato in grado di trovare) non sembrano affrontare questa particolare domanda. Mi piacerebbe sapere se posso riavviare ragionevolmente l'autoloading in librerie di solo 1.9 senza alcun dolore ragionevole.

Grazie in anticipo per eventuali approfondimenti.

+1

Il collegamento "questo famoso thread" è rotto –

risposta

7

non so in merito al caso generale, ma ad esempio Repro da quel filo non si rompe in 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. Perché oh, perché non ci ho pensato? Dopo averlo riprodotto personalmente e provato alcune varianti di stress-test (e confermando con RVM che è ancora rotto in 1.8.7, JRuby e Rubinius - tutto ** tranne ** 1.9.1 e 1.9.2) sto chiamando questo ha risposto Grazie! – SFEley

+0

Mi sorprende che JRuby non sia sicuro per i thread: pensavo che la sicurezza del thread fosse uno dei loro obiettivi. –

-4

è sempre rotto.

subload consente di passare da una modalità all'altra in un ambiente thread.

Io uso autoload ancora nell'ambiente con thread, ma solo durante una sequenza di avvio a thread singolo. Non vedo alcuna buona ragione per avere un processo di avvio multithread in un'applicazione reale. Se non avete uno, è probabile che sia necessario fare la fila azioni per le biblioteche di carico condivisa come si avrà sempre problemi di sicurezza filo con l'installazione di classe e livello di istanza, la maggior parte partuclarly con cose come:

class Lib 
    extend SomeClassFuncs 
    do_something_with_class_funcs 
end 

Questo codice non è filo sicuro un tempo di carico, indipendentemente dal caricatore.

Se non riesci a vedere questo, non si dovrebbe essere threading.

+0

Subload? Cos'è il sottocarico? - Vedo il tuo punto, ma come fai notare, quella metaprogrammazione è altrettanto poco sicura con 'require' come con' autoload'. La mia domanda era se il bug specifico in "autoload" documentato da Charles Nutter qualche tempo prima fosse stato corretto in Ruby 1.9, e lo è stato. – SFEley

+0

Il sottomodulo è https://github.com/raggi/subload – raggi

+0

Il bug di sicurezza del thread del caricamento automatico non può essere corretto. Solo alcuni casi possono essere regolati. – raggi

9

Portare un aggiornamento del 2011 a questo, dal momento che anche io ero curioso.

Due biglietti sono attualmente aperte:

Gli sviluppatori principali suggeriscono che richiedono e lavorare autoload nello stesso modo e sono sicuri filo, in CRuby/JRuby 1.9 . Questo, nel senso che ruby ​​mantiene un blocco finché il file non è completamente caricato.

Questo ha l'effetto collaterale scomodo dell'introduzione di potenziali deadlock, tuttavia. In particolare:

  1. Th1 carico A e lo blocca
  2. Th2 carico B e lo blocca
  3. Th1 cerca di caricare B come parte di carico A, inizia attesa Th2
  4. Th2 tenta di caricare A come parte del caricamento B, inizia ad aspettare Th1
  5. Deadlock ...

La conclusione è probabilmente: richiede tutto ciò che è necessario prima di iniziare una discussione se c'è un potenziale di deadlock nella tua app.

+0

Un A desiderante B, e B che desidera A, sono un leggero odore di codice? –

+1

Posso immaginare questo tipo di cose che accadono su un server threadato il cui caricamento iniziale della pagina fa scattare tonnellate di autoloading. I suddetti due thread in realtà hanno una menzione di questo stesso scenario. –

+2

In aggiunta a questo, vale la pena notare che indipendentemente dalla sicurezza del thread ruby, [event-machine non è thread-safe] (https://github.com/eventmachine/eventmachine/issues/97). Considerando che sia il thin che il goliath sono basati su di esso, e che né il meticcio né il webrick usano i thread, e che mod_rack si basa su lavoratori ibridi/webrick, non ha molta importanza alla fine della giornata. ;-) –