Комментарии 26
Вечная проблема, на каком языке вы пишете?
статья — тихий ужас :(
Ну и вообще, автор, у вас дикий хаос в голове: смысл писать статьи, если вы еще в теме не разобрались?
www.humblelittlerubybook.com/book/html/chapter4.html — хотя бы это стоит прочитать для начала
www.humblelittlerubybook.com/book/html/chapter4.html — хотя бы это стоит прочитать для начала
В чем именно хаос..?
прочитайте ссылку, если останутся вопросы, в чем хаос — я отвечу
отвечайте
Отвечаю: статья — поток сознания автора на тему «Я не читаю документацию, прежде чем писать программы»
Все то, что выше записано с кучей неправильных примеров можно записать вот так:
Ruby Thread API описано здесь www.ruby-doc.org/core/classes/Thread.html
Все то, что выше записано с кучей неправильных примеров можно записать вот так:
threads = [] # здесь хранятся все потоки в программе threads << Thread.new do # так создается и сразу же запускается первый поток ... # код, который выполнится в созданном процессе end ... threads << Thread.new do ... end threads.each { |thread| thread.join } # ждем окончания всех потоков, а не sleep'ом, как предлагаете вы
Ruby Thread API описано здесь www.ruby-doc.org/core/classes/Thread.html
чем ваш массив лучше Thread.list?
Я не предлагаю пользоваться sleep'ом, и вообще каких-либо методик, я просто объясняю как работают треды. Идея такая, что прочитавший сам решит как ему использовать потоки. Чтобы он понимал, что от join, до следующего после него метода, пауза длинною в исполнение треда.
Я не предлагаю пользоваться sleep'ом, и вообще каких-либо методик, я просто объясняю как работают треды. Идея такая, что прочитавший сам решит как ему использовать потоки. Чтобы он понимал, что от join, до следующего после него метода, пауза длинною в исполнение треда.
Вы не объясняете, к сожалению, хотя желание похвально.
что по вашему не объяснено?
я попробую раскрыть в следующей статье.
я попробую раскрыть в следующей статье.
Объяснено может и всё, но изложено всё очень сумбурно. Если хотите, чтобы ваши статьи читались, а не пролистывались, нужно писать более последовательно, а вставки про «я сделал то, потом ещё, а он не завёлся» обрабатывать напильником до удобоваримого состояния. Если читатель зациклится на них, то может не заметить что же вы хотели сказать :)
и что без join тоже все работает, и зачем конкретно он нужен.
Вы запутались!
1. sleep — не хитрый чит запускающий треды, вы просто даете время тредам уложиться в указанное в sleep время
2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода join треды живы и работают
Отсюда делаем выввод, в действительности треды запускаются и без метода join, но так как вы не сказали руби, что нужно подождать выполнения ваших тредов, то они завершаются мгновенно.
Именно для этого и нужен метод join.
p.s. Удачного распараллеливания :)
1. sleep — не хитрый чит запускающий треды, вы просто даете время тредам уложиться в указанное в sleep время
2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода join треды живы и работают
Отсюда делаем выввод, в действительности треды запускаются и без метода join, но так как вы не сказали руби, что нужно подождать выполнения ваших тредов, то они завершаются мгновенно.
Именно для этого и нужен метод join.
p.s. Удачного распараллеливания :)
>2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода join треды живы и работают
— не правда. Он не запрещает завершаться, а усыпляет тред из которого вызван, и таким образом не дает завершаться.
выполните:
Thread.new{
loop{
sleep 1
}
}.join
puts «все что после join, не выполнится, пока не завершится тред, которому он вызван»
Для вас эта статья тоже полезна;)
— не правда. Он не запрещает завершаться, а усыпляет тред из которого вызван, и таким образом не дает завершаться.
выполните:
Thread.new{
loop{
sleep 1
}
}.join
puts «все что после join, не выполнится, пока не завершится тред, которому он вызван»
Для вас эта статья тоже полезна;)
p Thread.list[0] # Берем список тредов, а точнее первый
p Thread.main # Берем главный тред
p Thread.current # Берем текущий тред
# Как бы все равны
t = Thread.main.group # Берем группу основного треда
$mutex = Mutex.new
p 'Thread #1 define start'
t1 = Thread.new {
p ' Thread #1 start'
1_000_000.times{
'string1'.to_sym
}
p ' Thread #1 end'
}
p 'Thread #1 define end'
p 'Thread #2 define start'
t2 = Thread.new {
p ' Thread #2 start'
1_000_000.times{
'string2'.to_sym
}
p ' Thread #2 end'
}
p 'Thread #2 define end'
p 'Thread #1 add start'
t.add(t1)
p 'Thread #1 add end'
p 'Thread #2 add start'
t.add(t2)
p 'Thread #2 add end'
=begin
Результат без join будет одинаков
Но если добавить операцию требующую большего времени на выполнение, чем остальные треды
=end
6_000_000.times{
'string3'.to_sym
}
# Все будет хорошо
=begin
Объясните тогда следующий код
=end
list = []
list << Thread.new{
loop{
1_000_000.times{ 'string1'.to_sym }
p 'tick #1'
}
}
list << Thread.new{
loop{
1_000_000.times{ 'string2'.to_sym }
p 'tick #2'
}
}
list.each{|t| t.join }
#Работают оба треда
p Thread.main # Берем главный тред
p Thread.current # Берем текущий тред
# Как бы все равны
t = Thread.main.group # Берем группу основного треда
$mutex = Mutex.new
p 'Thread #1 define start'
t1 = Thread.new {
p ' Thread #1 start'
1_000_000.times{
'string1'.to_sym
}
p ' Thread #1 end'
}
p 'Thread #1 define end'
p 'Thread #2 define start'
t2 = Thread.new {
p ' Thread #2 start'
1_000_000.times{
'string2'.to_sym
}
p ' Thread #2 end'
}
p 'Thread #2 define end'
p 'Thread #1 add start'
t.add(t1)
p 'Thread #1 add end'
p 'Thread #2 add start'
t.add(t2)
p 'Thread #2 add end'
=begin
Результат без join будет одинаков
Но если добавить операцию требующую большего времени на выполнение, чем остальные треды
=end
6_000_000.times{
'string3'.to_sym
}
# Все будет хорошо
=begin
Объясните тогда следующий код
=end
list = []
list << Thread.new{
loop{
1_000_000.times{ 'string1'.to_sym }
p 'tick #1'
}
}
list << Thread.new{
loop{
1_000_000.times{ 'string2'.to_sym }
p 'tick #2'
}
}
list.each{|t| t.join }
#Работают оба треда
Соглашусь что блокируется, любое исполнение кода сразу после join до завершение треда, НО другие треды не блокируются.
Такова модель нативных тредов в руби.
Такова модель нативных тредов в руби.
Если join не катит по религиозным соображениям и хочется написать sleep, лучше напишите:
until Thread.list.size == 1 do Thread.pass end #Более кошерный метод
until Thread.list.size == 1 do Thread.pass end #Более кошерный метод
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Ruby знакомство с Thread