2012-07-08 12 views
6

Come ho capito, Ruby 1.9 utilizza i thread del sistema operativo ma solo un thread verrà comunque eseguito contemporaneamente (anche se un thread potrebbe eseguire il blocco dell'IO mentre un altro thread sta elaborando). Gli esempi di threading che ho visto usano solo Thread.new per avviare un nuovo thread. Provenendo da uno sfondo Java, in genere utilizzo i pool di thread per non avviarli a molti nuovi thread poiché sono "pesanti".Ruby 1.9 pool di thread

Esiste un modello di pool di thread incorporato in ruby? Non ne ho visto uno nelle librerie di lingue predefinite. Oppure esiste una gemma standard che viene in genere utilizzata? Dal momento che il threading a livello di sistema operativo è una funzionalità più recente di Ruby, non so quanto siano mature le librerie per questo.

risposta

6

Si è corretto in quanto l'interprete C Ruby predefinito esegue solo un thread alla volta (altri linguaggi dinamici basati su C come Python hanno restrizioni simili). A causa di questa restrizione, il threading non è così comune in Ruby e, di conseguenza, non esiste una libreria di threadpool predefinita. Se ci sono compiti da svolgere in parallelo, le persone in genere utilizzano i processi poiché i processi possono scalare su più server.

Se è necessario utilizzare thread, è consigliabile utilizzare https://github.com/meh/ruby-threadpool sulla piattaforma JRuby, che è un interprete Ruby in esecuzione sulla JVM. Questo dovrebbe essere perfetto per te e, dato che è in esecuzione sulla macchina virtuale, avrà un vero threading.

+0

Grazie. In realtà non ho un caso d'uso in questo momento, ma mentre stavo leggendo il libro piccone, questo era qualcosa di cui non ero sicuro, ma tu hai chiarito. –

+12

Non capisco mentre la gente dice che i thread sono inutili in Ruby perché non vengono eseguiti contemporaneamente. Sono davvero inutili per le attività legate alla CPU, ma possono essere molto utili per qualsiasi IO di blocco che si desidera eseguire in parallelo. Per esempio. richieste HTTP simultanee. – Kamchatka

+0

Grazie per il commento. Devo chiarire ulteriormente che i thread non sono inutili in Ruby, solo che le persone devono essere consapevoli della limitazione del GIL poiché i thread non sono privi di overhead. Per l'I/O non bloccante, una chiamata asincrona basata su evento C può essere più appropriata. Vedi http://blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3 per ulteriori informazioni. – Wulfram