スレッドを最初に発見したときに、通常sleepを呼び出すよりも、多くのスレッドでsleepを呼び出すことで、実際にスレッドが正常に機能していることを確認しました。それは働いて、とても幸せだった。本当に並行していないRubyスレッドにはどのような使い方ができますか?
しかし、私の友人は、これらのスレッドは本当に並行ではなく、睡眠はそれを偽っているに違いないと私に言った。
は、だから今、私はいくつかの実際の処理を行うために、このテストを書いた:
class Test
ITERATIONS = 1000
def run_threads
start = Time.now
t1 = Thread.new do
do_iterations
end
t2 = Thread.new do
do_iterations
end
t3 = Thread.new do
do_iterations
end
t4 = Thread.new do
do_iterations
end
t1.join
t2.join
t3.join
t4.join
puts Time.now - start
end
def run_normal
start = Time.now
do_iterations
do_iterations
do_iterations
do_iterations
puts Time.now - start
end
def do_iterations
1.upto ITERATIONS do |i|
999.downto(1).inject(:*) # 999!
end
end
end
そして今、私はとても悲しい、run_threads()がrun_normalより良いを実行していなかっただけでなくので、それも遅かったです!
スレッドが本当に並行していない場合、スレッドを使用してアプリケーションを複雑にするのはなぜですか? fl00r @
** UPDATE **
は、私はIOタスクのためにそれらを使用した場合、私はスレッドを利用することができると言ったので、私はdo_iterationsの2つの以上のバリエーション書いた:
def do_iterations
# filesystem IO
1.upto ITERATIONS do |i|
5.times do
# create file
content = "some content #{i}"
file_name = "#{Rails.root}/tmp/do-iterations-#{UUIDTools::UUID.timestamp_create.hexdigest}"
file = ::File.new file_name, 'w'
file.write content
file.close
# read and delete file
file = ::File.new file_name, 'r'
content = file.read
file.close
::File.delete file_name
end
end
end
def do_iterations
# MongoDB IO (through MongoID)
1.upto ITERATIONS do |i|
TestModel.create! :name => "some-name-#{i}"
end
TestModel.delete_all
end
パフォーマンスの結果は、通常の>スレッドと同じです。
しかし、私のVMがすべてのコアを使用できるかどうかはわかりません。私はそれをテストしたときに戻ってきます。
スレッドは吸う、繊維岩! :D – fl00r
公式のルビーを使用するとスレッディングが偽装されますが、jrubyとrubiniusの場合は本当のスレッディングと信じています。 – texasbruce
パフォーマンスはスレッドを使用する唯一の理由ではありません。私の答えを見てください。 – Phrogz