2014-04-22 8 views
1

У меня есть алгоритм, который может запускаться в течение неограниченного периода времени, обновляя результаты по мере их появления. Он использует что-то похожее на Iterative Deepening Search. По истечении заданного промежутка времени я бы хотел, чтобы алгоритм остановился, поэтому я могу использовать результат, который он вычислял.Как использовать алгоритм в Ruby?

Вот пример того, как я это с помощью выполнения темы:

best_result = 0 
thread = Thread.new { 
    while true 
    new_result = rand 
    best_result = new_result if new_result > best_result 
    end 
} 
sleep 5 
thread.exit 
puts best_result 

Есть ли лучший способ временного ящика алгоритм в Ruby?

Update

Производительность является ключевым фактором.

ответ

1

Использование Timeout.

best_result = 0 
begin 
    timeout(5) do 
    while true 
     new_result = rand 
     best_result = new_result if new_result > best_result 
    end 
    end 
rescue Timeout::Error 
    puts "That's enough. Result is #{best_result}" 
end 

Это фактически делает то же самое, что вы делаете (выполнить в другом потоке, поток получает мертв через 5 секунд), но абстрагирует тайм-аут обработки из вашего кода. И это в стандартной библиотеке.

+0

Исключение немного нечетное, так как оно не является случаем исключения (всегда будет тайм-аут). Тем не менее, я думаю, что это хороший вариант. –

+0

* Это эффективно делает то же самое * => Нет, это не так. – sawa

+0

@sawa: Хорошо, почти то же самое: роли двух потоков переключаются, а вещь, выполняемая в другом потоке, спящая. Это функционально эквивалентно, хотя, если я что-то не хватает. – Amadan