2012-03-09 7 views
0

Почему этот код работать (я вижу выход 1 2 3):Темы Руби

for i in 1..3 
    Thread.new{ 
     puts i 
    } 
end 

Однако, следующий код делает не производить тот же результат (я не вижу выход 1 2 3)?

for i in 1..3 
    Thread.new{ 
     sleep(5) 
     puts i 
    } 
end 

ответ

4

Когда вы попадаете в конец сценария, выходит Ruby. Если вы добавите sleep 10 после финального цикла, вы увидите, что вывод отображается. (Albeit, так как 3 каждый раз, потому что привязка к i отражает значение в конце обработки, и сон вызывает переключение потоков обратно в петлю.)

Вы могли бы хотеть что-то вроде:

threads = [] 
for i in 1..3 
    threads << Thread.new { 
    sleep 5 
    puts i 
    } 
end 
threads.map {|t| t.join } 

Это будет ждать завершения всех потоков до выхода.

+0

Big thnx! Я не знаю о необходимости. Присоединяйтесь к теме. –