2012-02-16 13 views
5

javascriptではイベント駆動型なので、setTimeoutはブロックされないようです。これは、私がこれを行う場合:javascriptとnon-blockingのsetTimeoutとrubyのsleep

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

それの出力は以下となり'prints first!!'、その後'sleeping'

jsインタプリタはsetTimeoutが終了するまで待たず、その直後にコードを実行します。 10msが経過すると、コールバック関数が実行されます。

最近私は最近ルビーで遊んでいます。私はそれがイベントマシンライブラリで非ブロッキングサポートを持っていることを知っています。しかし、私はちょうどsleepでjavascriptで書かれているsetTimeoutの例や、イベントマシンのサポートなしでネイティブでrubyの関数を使うことができるのだろうか? closure procやblockなどを使ってこれを行うことは可能ですか?ありがとう。

答えて

5

setTimeoutの機能は、sleepのように、前者は非同期であり、後者は同期的であるため、何もありません。

Ruby sleepメソッドは、POSIXのように、スクリプトの実行を停止します。 JavaScriptのsetTimer関数は、後でコールバックをトリガーします。

非同期コールバックをトリガーしたい場合は、イベントループを実行するためにEventMachineのようなものが必要になることがあります。あなたがスレッドプログラミングの道を行きたい場合、私は知らない

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 

2

あなたがスレッドを持ついくつかの非常に基本的な非同期動作を得ることができます。それは私にとって過酷なようですが、EventMachineを使用できない場合はオプションです。

+0

ええ、それはスレッドが私が使っているものになるように見えません。私は、イベントマシンで非同期処理を行う必要があることを知っていますが、私はちょうど興味がありました。ありがとう –

+0

非同期コールバックをトリガするスレッドの大きな問題は、呼び出し元スレッドでそのコールバックブロックの実行を強制しようとしています。適切なイベントループがある場合を除いて、これは難しいです。 – tadman