Kiedy po raz pierwszy odkryłem wątki, próbowałem sprawdzić, czy faktycznie działały zgodnie z oczekiwaniami, wywołując sen w wielu wątkach, w przeciwieństwie do normalnego wywoływania snu. Udało się i byłem bardzo szczęśliwy.Co mogę użyć w wątkach Ruby, jeśli nie są one naprawdę równoległe?
Ale wtedy mój przyjaciel powiedział mi, że nici te nie były tak naprawdę równoległe, a ten sen musi udawać.
Więc teraz pisałem ten test zrobić jakieś prawdziwe przetwarzania:
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
A teraz jestem bardzo smutny, ponieważ run_threads() nie tylko nie działają lepiej niż run_normal było nawet wolniej!
Dlaczego więc powinienem komplikować moją aplikację za pomocą wątków, jeśli nie są one naprawdę równoległe?
** UPDATE **
@ fl00r powiedział, że mogę skorzystać z wątków gdybym używał ich do zadań IO, więc napisałem jeszcze dwa warianty 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
The Wyniki wydajności są wciąż takie same: normalne> wątki.
Ale teraz nie jestem pewien, czy moja maszyna wirtualna jest w stanie używać wszystkich rdzeni. Wróci, kiedy to przetestuję.
Nici są do bani, włókna Fibers! : D – fl00r
Nawlekanie jest sfałszowane, jeśli używasz oficjalnego rubinu, ale dla jubilera i rubiniusa, uważam, że jest to prawdziwe gwintowanie. – texasbruce
Wydajność nie jest jedynym powodem używania wątków. Zobacz moją odpowiedź. – Phrogz