當我第一次發現線程時,我試着通過在很多線程中調用睡眠來檢查它們是否按預期工作,而不是正常調用睡眠。它工作,我很高興。如果Ruby線程不是真的平行,我可以給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說我可以利用線程,如果我用他們的IO任務,所以我寫了do_iterations的兩個變化:
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 2012-04-19 10:21:28
如果你使用官方ruby,線程僞造,但對於jruby和rubinius,我相信它是真正的線程。 – texasbruce 2012-04-19 12:21:47
性能不是使用線程的唯一原因。看到我的答案。 – Phrogz 2012-04-19 15:53:36