私はruby threads/fiberがIOを1.9でブロックしていると読んでいます。これは本当ですか、それは本当に何を意味していますか?私はいくつかのネット/ httpのものを複数のスレッドで行う場合、その要求に対して与えられた時間に実行されるスレッドは1つだけですか?rubyスレッドブロック?
ありがとう
私はruby threads/fiberがIOを1.9でブロックしていると読んでいます。これは本当ですか、それは本当に何を意味していますか?私はいくつかのネット/ httpのものを複数のスレッドで行う場合、その要求に対して与えられた時間に実行されるスレッドは1つだけですか?rubyスレッドブロック?
ありがとう
を処理します。ただし、要求が並行して行われるのは、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のような他の実装には、実際のスレッドがあり、複数のスレッドを並列に実行することができます。
いくつかの良い参考文献:
すべてのスレッドは同時に実行されますが、IOはすべて終了するまでブロックされます。
つまり、スレッドを使用しても、プロセスを「バックグラウンド」することはできません。インタープリタは、メッセージをさらに送信する前に、すべてのスレッドが完了するのを待ちます。
これは、スレッドが変更/作業しているデータを次のプロセスが使用する場合に完了しているかどうか不思議に思う必要がないため、これを考えると良いことです。
あなたは、バックグラウンドにしたい場合は、チェックアウトdelayed_job一つだけのスレッドが同時に実行される、CRubyを使用していると仮定すると、