2016-04-12 3 views
0

Мои записи в базе данных уже классифицированы в ведра (0, 1, 2, 3). Вместо того, чтобы последовательно применять функцию к каждой записи, я хотел бы открыть четыре потока и применить функцию к записи в ведре этого потока.Ruby multi threading #join и одновременное выполнение

Если я запускаю это:

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

я получаю:

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

с ожиданием между каждой из них. Это по-прежнему идет серийно.

Если бы я сделать то же самое, что и выше, но без join:

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

я получаю:

opening thread for 3 degree 
opening thread for 2 degreeopening thread for 0 degree 
opening thread for 4 degree 

который ближе к тому, что я хочу; кажется, все они работают одновременно.

Это заставляет меня нервничать, когда мои заявления о предложениях печатаются случайным образом. Если у меня нет join, разве это не означает, что какой-либо поток заканчивается первым, остальная часть скрипта перемещается, а остальные потоки заканчиваются раньше? Что мне делать?

ответ

4

Что я должен делать здесь?

Вы должны присоединиться к своим темам. В противном случае, когда основной поток (ваш скрипт) выходит, он принимает все незавершенные потоки с ним. Причина, по которой исполнение является серийным в вашем первом случае, - это то, что вы ждете окончания потока сразу после его запуска (и , прежде чем вы начнете следующий). Сначала создайте все потоки, затем ждите их.

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) 

Вы увидите дальнейшие улучшения в резьбе производительности при запуске коды на JRuby или Rubinius, так как их нить не искалечены в любом случае какой-то глобальная блокировкой.