2012-02-16 11 views
5

Tak więc, w javascript, ponieważ jest to spowodowane zdarzeniami z natury, wydaje się, że setTimeout nie blokuje. Oznacza to, że jeśli to zrobić:non-blocking setTimeout w javascript vs sleep in ruby ​​

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

Będzie wyjście 'prints first!!' a następnie 'sleeping'.

Js interpreter nie będzie czekać, aż setTimeout zostanie wykonane, zamiast tego wykonuje kawałek kodu pod nim od razu. Po 10 ms następuje wywołanie funkcji zwrotnej.

Teraz ostatnio bawię się z rubinem. Wiem, że ma on nieblokujące wsparcie w bibliotece zdarzeń-maszyn. Ale zastanawiam się, czy możemy osiągnąć coś podobnego do przykładu setTimeout, który właśnie napisałem w javascript z sleep lub jakąkolwiek inną funkcję w rubu natywnie bez obsługi event-machine? Czy to w ogóle możliwe przy użyciu procesu zamknięcia lub bloku? Dzięki.

Odpowiedz

5

Funkcja jest niczym w porównaniu z sleep, ponieważ pierwsza jest asynchroniczna, a druga synchroniczna.

Metoda Ruby sleep, podobnie jak jej odpowiednik POSIX, zatrzymuje wykonywanie skryptu. Funkcja setTimer w języku JavaScript wyzwala wywołanie zwrotne w przyszłości.

Jeśli chcesz wywołać asynchroniczne wywołanie zwrotne, możesz potrzebować czegoś takiego jak EventMachine, aby uruchomić pętlę zdarzeń.

2

Można dostać jakąś bardzo podstawowe zachowania asynchroniczny z wątków:

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 

ja nie wiem, czy chcesz iść w dół drogi programowania gwintu. To chyba przesada, ale jest to opcja, jeśli nie możesz używać EventMachine.

+0

Tak, nie wygląda na to, że wątek będzie czymś, z czego będę korzystać. Wiem, że asynchronizacja musi być zrobiona z maszyną zdarzeń, ale byłem po prostu ciekawy. dzięki –

+0

Duży problem z wątkami wyzwalającymi asynchroniczne wywołania zwrotne próbuje wymusić wykonanie tego bloku wywołania zwrotnego na wątku wywołującym. Jest to trudne, chyba że masz odpowiednią pętlę zdarzeń, gdzie są dobrze zdefiniowane miejsca do ich wykonania. – tadman