Как синхронизировать алгоритм в 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?
Обновить
Производительность является ключевым фактором.
1 ответ
Решение
Используйте Тайм-аут.
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 секунд), но абстрагирует обработку тайм-аута из вашего кода. И это в стандартной библиотеке.