2012-01-07 3 views
2

私はruby threads/fiberがIOを1.9でブロックしていると読んでいます。これは本当ですか、それは本当に何を意味していますか?私はいくつかのネット/ httpのものを複数のスレッドで行う場合、その要求に対して与えられた時間に実行されるスレッドは1つだけですか?ruby​​スレッドブロック?

ありがとう

答えて

2

を処理します。ただし、要求が並行して行われるのは、IOが完了していない間に各スレッドがIOでブロックされるためです。したがって、次のような場合:

require 'open-uri' 
threads = 10.times.map do 
    Thread.new do 
    open('http://example.com').read.length 
    end 
end 

threads.map &:join 
puts threads.map &:value 

これを実行するよりもはるかに高速です。

また、完了時にスレッドがブロックされていないかどうかを確認することもできます。例えば

:CRubyで

require 'open-uri' 
thread = Thread.new do 
    sleep 10 
    open('http://example.com').read.length 
end 
puts 'still running' until thread.join(5) 
puts thread.value 

、スレッドが同時に実行することはできませんが、彼らはまだ便利です。 JRubyのような他の実装には、実際のスレッドがあり、複数のスレッドを並列に実行することができます。

いくつかの良い参考文献:

1

すべてのスレッドは同時に実行されますが、IOはすべて終了するまでブロックされます。

つまり、スレッドを使用しても、プロセスを「バックグラウンド」することはできません。インタープリタは、メッセージをさらに送信する前に、すべてのスレッドが完了するのを待ちます。

これは、スレッドが変更/作業しているデータを次のプロセスが使用する場合に完了しているかどうか不思議に思う必要がないため、これを考えると良いことです。

あなたは、バックグラウンドにしたい場合は、チェックアウトdelayed_job一つだけのスレッドが同時に実行される、CRubyを使用していると仮定すると、

関連する問題