2012-02-16 958 views
5

Por lo tanto, en javascript dado que es un evento controlado por su naturaleza, parece que setTimeout no bloquea. Esto significa que si hago esto:setTimeout sin bloqueo en javascript vs sleep en ruby ​​

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

Se dará salida 'prints first!!' y luego 'sleeping'.

El intérprete js no esperará hasta que se complete setTimeout, sino que ejecuta el fragmento de código que se encuentra debajo. Cuando pasan 10ms, entonces ejecuta la función de devolución de llamada.

Ahora he estado jugando con ruby ​​recientemente. Sé que tiene soporte no bloqueante en la biblioteca de máquina de eventos. Pero me pregunto si podemos lograr algo similar al ejemplo de setTimeout que acabo de escribir en javascript con sleep o cualquier función en ruby ​​de forma nativa sin soporte de máquina de eventos. ¿Es esto posible usando un programa de cierre o un bloque o algo así? Gracias.

Respuesta

5

La función setTimeout no se parece en nada a sleep ya que la primera es asíncrona y la segunda es síncrona.

El método Ruby sleep, al igual que su contraparte POSIX, detiene la ejecución del script. La función setTimer en JavaScript activa una devolución de llamada en el futuro.

Si desea desencadenar una devolución de llamada asincrónica, es posible que necesite algo como EventMachine para ejecutar un bucle de evento para usted.

2

usted podría conseguir un comportamiento asíncrono muy básico con hilos:

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 

No sé si quiere ir por el camino de la programación hilo. Eso me parece exagerado, pero es una opción si no puedes usar EventMachine.

+0

sí, no parece que el hilo vaya a ser algo que voy a usar. Sé que se necesita hacer sincronía con la máquina de eventos, pero solo tenía curiosidad. gracias –

+0

El gran problema con los hilos que activan devoluciones de llamada asincrónicas es forzar la ejecución de ese bloque de devolución de llamada en el hilo de llamada. Esto es complicado a menos que tenga un bucle de eventos adecuado donde haya lugares bien definidos para ejecutarlos. – tadman