Пытаюсь понять Threading в Ruby. Тестовый код не работает должным образом, почему? - PullRequest
0 голосов
/ 06 августа 2010

Итак, я написал для себя быстрый пример потока, используя документы ruby ​​для потока:

puts "Hello World"
test = Thread.new do
while true
  puts Time.now
end
end
puts "Goodbye World"

Я бы ОЖИДАЛ, что этот код будет выполняться вечно, напечатав «Hello World», несколько отметок времени,Прощай, мир, а потом целая куча временных отметок, пока я не нарушу код вручную.

Вместо этого я получаю что-то вроде:

Hello World
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Fri Aug 06 09:08:27 -0400 2010
Goodbye World

И тогда программа завершается.Я ДЕЙСТВИТЕЛЬНО смущен здесь.Завершаются ли потоки, как только начнется следующая строка кода?Они тайм-аут?Я попытался добавить

sleep 1

до и после оператора put ... но это просто означает, что поток печатает меньше меток времени (если сон перед запуском, он ничего не печатает, просто привет идо свидания, если после этого он печатает ровно одну временную отметку перед выходом).

У меня нет многопоточности ... но мне это кажется не совсем понятным ... Я что-то не так делаю?Использование потоков неправильно?Я делаю это правильно, но не понимаю, какие темы есть / делают?

Ответы [ 2 ]

6 голосов
/ 06 августа 2010
puts "Hello World"
test = Thread.new do
  while true
    puts Time.now
  end
end   
puts "Goodbye World"         
test.join

Вызов метода .join для экземпляра класса Thread приведет к остановке программы и ожиданию завершения этого потока.

1 голос
/ 06 августа 2010

Не уверен насчет вещей, специфичных для Ruby. Кроме того, обычно, когда сценарий заканчивается, программа завершается - во многих случаях все потоки уничтожаются до выхода из интерпретатора.

Потоки - это просто способ сделать пару вещей одновременно - вы не должны рассчитывать на них, чтобы поддерживать вашу программу живой, особенно после того, как основной поток (тот, который начал все), умирает. Если вы хотите дождаться завершения потока, в большинстве языков есть функция "join" или "wait", которая позволяет завершить поток. Но как только основной поток завершен, все ставки сняты.

С учетом вышесказанного, Ruby может решить запустить потоки, пока они не закончат. Как я уже сказал, не уверен в этом, потому что это специфично для Ruby. Но, судя по всему, это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...