Как синхронизировать алгоритм в 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 секунд), но абстрагирует обработку тайм-аута из вашего кода. И это в стандартной библиотеке.

Другие вопросы по тегам