Как стать автором
Обновить

Комментарии 26

Вечная проблема, на каком языке вы пишете?
Ruby
Периименуйте в «Знакомство с Thread в Ruby». Это ведь Ruby?:)
Ой, нетуда ответил.
Вы меня спрашиваете? xD
Нет, промахнулся с коментарием просто:)
Исправил.
(в ярлыках руби)
статья — тихий ужас :(
Ну и вообще, автор, у вас дикий хаос в голове: смысл писать статьи, если вы еще в теме не разобрались?
www.humblelittlerubybook.com/book/html/chapter4.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, до следующего после него метода, пауза длинною в исполнение треда.
Вы не объясняете, к сожалению, хотя желание похвально.
что по вашему не объяснено?
я попробую раскрыть в следующей статье.
Объяснено может и всё, но изложено всё очень сумбурно. Если хотите, чтобы ваши статьи читались, а не пролистывались, нужно писать более последовательно, а вставки про «я сделал то, потом ещё, а он не завёлся» обрабатывать напильником до удобоваримого состояния. Если читатель зациклится на них, то может не заметить что же вы хотели сказать :)
хорошо, учту:)
и что без join тоже все работает, и зачем конкретно он нужен.
Например, что бы выполнить какие-то действия по окончанию работы треда.
Вы запутались!

1. sleep — не хитрый чит запускающий треды, вы просто даете время тредам уложиться в указанное в sleep время
2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода join треды живы и работают

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

Именно для этого и нужен метод join.

p.s. Удачного распараллеливания :)
>2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода 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 }

#Работают оба треда

Соглашусь что блокируется, любое исполнение кода сразу после join до завершение треда, НО другие треды не блокируются.

Такова модель нативных тредов в руби.
Именно об этом я и написал в статье:)
Если join не катит по религиозным соображениям и хочется написать sleep, лучше напишите:
until Thread.list.size == 1 do Thread.pass end #Более кошерный метод
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории