2016-04-12 20 views
0

Kayıtlarıma zaten kova sınıflandırılır (0, 1, 2, 3). Her kayda seri olarak bir işlev uygulamak yerine, dört iş parçacığı açmak ve işlevi bu iş parçacığı kümesindeki kayıtlara uygulamak istiyorum.Yakut çok parçacığı #join ve aynı anda yürütme bir veritabanında

Koşarsam bu:

i = 4 
i.times do |n| 
    Thread.new { 
    puts "opening thread for #{n} degree" 
    myFunction(n) 
    }.join 
end 

alıyorum:

opening thread for 0 degree 
opening thread for 1 degree 
opening thread for 2 degree 
opening thread for 3 degree 

her biri arasında bekletilerek. Hala seri gidiyor.

Ben yukarıdaki gibi aynı şeyi, ama join olmadan ise:

i = 4 
i.times do |n| 
    Thread.new { 
    puts "opening thread for #{n} degree" 
    myFunction(n) 
    } 
end 

alıyorum:

ne istiyorum daha yakın
opening thread for 3 degree 
opening thread for 2 degreeopening thread for 0 degree 
opening thread for 4 degree 

; hepsi aynı anda çalışır gibi görünüyor. Benim koyar ifadeleri böyle gelişigüzel basılır zaman

O beni sinirlendiriyor. Orada join yoksa, bu hangi iş parçacığının ilk önce sonlandığını, komut dosyasının geri kalanı devam ederken ve diğer iş parçacıklarının erken sona ereceği anlamına gelmez mi? Ne yapmalıyım?

cevap

4

Burada ne işim ÖNERİ?

Sen konuları katılmadan edilmelidir. Aksi takdirde, ana iş parçacığınız (komut dosyanız) çıktığında, bitmemiş tüm iş parçacıklarını alır. yürütme İlk durumda seri olmasının sebebi bir iş parçacığı bunu başlatmak (ve senden önce sonraki başlangıç) hemen sonra bitmesini beklemek. Önce tüm konuları oluşturun, ardından bekleyin. Onların ipler bazı küresel kilit tarafından herhangi bir şekilde sakat değil gibi

i = 4 
threads = i.times.map do |n| 
    Thread.new { 
    puts "opening thread for #{n} degree" 
    myFunction(n) 
    } 
end 

threads.each(&:join) 
# or 
require 'thwait' 
ThreadsWait.all_waits(*threads) 

Sen, JRuby veya Rubinius kod çalıştırırsanız performansını diş gelişimleri de göreceksiniz.

İlgili konular