Khi lần đầu tiên tôi phát hiện ra các chủ đề, tôi đã thử kiểm tra xem chúng có thực sự hoạt động như mong đợi hay không bằng cách gọi ngủ trong nhiều chủ đề, so với việc gọi ngủ bình thường. Nó hoạt động, và tôi rất hạnh phúc.Tôi có thể sử dụng những gì cho các chủ đề Ruby, nếu chúng không thực sự song song?
Nhưng sau đó một người bạn của tôi nói với tôi rằng các chủ đề này không thực sự song song, và giấc ngủ đó phải giả mạo nó.
Vì vậy, bây giờ tôi đã viết bài kiểm tra này để làm một số chế biến thực:
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
Và bây giờ tôi rất buồn, vì run_threads() không những không thực hiện tốt hơn so với run_normal, nó thậm chí còn chậm hơn!
Sau đó, tại sao tôi nên làm phức tạp ứng dụng của mình với chuỗi, nếu chúng không thực sự song song?
** CẬP NHẬT **
@ fl00r nói rằng tôi có thể tận dụng lợi thế của đề nếu tôi sử dụng chúng cho các nhiệm vụ IO, vì vậy tôi đã viết thêm hai biến thể của 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
Các kết quả hiệu suất vẫn như cũ: bình thường> chủ đề.
Nhưng bây giờ tôi không chắc liệu máy ảo của tôi có thể sử dụng tất cả các lõi hay không. Sẽ trở lại khi tôi đã thử nghiệm điều đó.
Chủ đề hút, Xơ đá! : D – fl00r
Threading là giả nếu bạn sử dụng ruby chính thức, nhưng đối với jruby và rubinius, tôi tin rằng đó là luồng thực tế. – texasbruce
Hiệu suất không phải là lý do duy nhất để sử dụng đề tài. Xem câu trả lời của tôi. – Phrogz