2012-02-16 17 views
5

Quindi, in javascript dal momento che è guidato dagli eventi per sua natura, sembra che setTimeout non blocchi. Questo vuol dire che se faccio questo:setTimeout non bloccante in javascript vs sleep in ruby ​​

setTimeout(function(){ 
    console.log('sleeping'); 
}, 10); 
console.log('prints first!!'); 

Sarà uscita 'prints first!!' e poi 'sleeping'.

L'interprete js non aspetterà che setTimeout venga eseguito, ma esegue immediatamente il pezzo di codice sottostante. Quando passa 10 ms, esegue la funzione di callback.

Ora ho giocato di recente con Ruby. So che ha un supporto non bloccante nella libreria di macchina degli eventi. Ma mi chiedo se possiamo ottenere qualcosa di simile all'esempio setTimeout che ho appena scritto in javascript con sleep o qualsiasi funzione in ruby ​​in modo nativo senza supporto di macchina degli eventi? E 'possibile tutto questo usando la proc o il blocco di chiusura o qualcosa del genere? Grazie.

risposta

5

La funzione setTimeout non assomiglia affatto a sleep poiché la prima è asincrona e la seconda è sincrona.

Il metodo Ruby sleep, come la sua controparte POSIX, interrompe l'esecuzione dello script. La funzione setTimer in JavaScript attiva una richiamata in un momento futuro.

Se si desidera attivare una richiamata asincrona, potrebbe essere necessario qualcosa come EventMachine per eseguire un ciclo di eventi per l'utente.

2

si potrebbe ottenere un comportamento asincrono molto semplice con le discussioni:

timeout = Thread.new(Time.now + 3) do |end_time| 
    while Time.now < end_time 
    Thread.pass 
    end 
    puts "Ding!" 
end 

main = Thread.new do 
    puts "Main" 
end 

main.join 
timeout.join 

Non so se si vuole andare in fondo alla strada della programmazione thread. Mi sembra eccessivo, ma è un'opzione se non puoi usare EventMachine.

+0

sì, non sembra che il thread sarà qualcosa che userò. so che async deve essere fatto con la macchina degli eventi, ma ero solo curioso. grazie –

+0

Il grosso problema con i thread che attivano le chiamate asincrone sta provando a forzare l'esecuzione di quel blocco callback sul thread chiamante. Questo è complicato a meno che tu non abbia un ciclo di eventi appropriato in cui ci siano luoghi ben definiti per eseguirli. – tadman