В ruby, как мне выполнить блок кода, но двигаться дальше через n секунд? - PullRequest
2 голосов
/ 09 апреля 2009

У меня есть метод библиотеки, который иногда зависает в сетевом соединении, и механизм тайм-аута отсутствует.

Какой самый простой способ добавить свой? По сути, я стараюсь не допустить, чтобы мой код застрял на неопределенное время.

Ответы [ 3 ]

4 голосов
/ 09 апреля 2009

timeout.rb имеет некоторые проблемы, которые в основном не всегда работают правильно, и я бы не рекомендовал его использовать. Отметьте Системный таймер или Терминатор вместо

На странице системного таймера, в частности, описывается, почему timeout.rb может завершиться ошибкой, в комплекте с красивыми картинками и всем остальным. Итог:

  • Чтобы timeout.rb работал, интерпретатор Ruby должен запланировать только что созданный «убийственный» поток Ruby.
  • M.R.I. 1.8, интерпретатор, используемый большинством приложений Ruby на производстве, реализует потоки Ruby как зеленые потоки.
  • Хорошо известно ограничение зеленых потоков (работающих поверх одного собственного потока), когда зеленый поток выполняет блокирующий системный вызов основных операционных систем, ни один из зеленых потоков на виртуальной машине не будет работать пока системный вызов не вернется.
4 голосов
/ 09 апреля 2009

Ответил на мой вопрос:

http://www.ruby -doc.org / STDLIB / libdoc / таймаут / RDoc / index.html

требуется «тайм-аут» status = Timeout :: timeout (5) { # Что-то, что должно быть прервано, если это занимает слишком много времени ... }

0 голосов
/ 30 июня 2011

Чтобы предотвратить уродливую ошибку при тайм-ауте, я предлагаю заключить ее и использовать спасение следующим образом:

begin
   status = Timeout::timeout(5) do 
      #Some stuff that should be interrupted if it takes too long
   end       
rescue Timeout::Error
   puts "Error message: It took too long!\n"
end  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...