модуль Timeout
Timeout блокировки с длительным выполнением
Краткое описание
require 'timeout'
status = Timeout::timeout(5) {
# Something that should be interrupted if it takes more than 5 seconds...
}
Описание
Timeout предоставляет способ автоматического завершения потенциально длительной операции, если она не завершится в заданное время.
Предыдущие версии не использовали модуль для именования пространства имён, однако timeout предоставлен для обратной совместимости. Вместо этого вы должны использовать #timeout.
Авторские права
- Авторские права
-
(C) 2000 Network Applied Communication Laboratory, Inc.
- Авторские права
-
(C) 2000 Агентство по продвижению информационных технологий, Япония
Константы
- ExitException
-
Вызывается #timeout, когда блок истекает по времени.
Публичные методы класса
# File lib/timeout.rb, line 72
def timeout(sec, klass = nil) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
message = "execution expired"
e = Error
bl = proc do |exception|
begin
x = Thread.current
y = Thread.start {
begin
sleep sec
rescue => e
x.raise e
else
x.raise exception, message
end
}
return yield(sec)
ensure
if y
y.kill
y.join # make sure y is dead.
end
end
end
if klass
begin
bl.call(klass)
rescue klass => e
bt = e.backtrace
end
else
bt = Error.catch(message, &bl)
end
rej = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-4}\z/o
bt.reject! {|m| rej =~ m}
level = -caller(CALLER_OFFSET).size
while THIS_FILE =~ bt[level]
bt.delete_at(level)
end
raise(e, message, bt)
end Выполните операцию в блоке, вызвав ошибку, если она занимает более sec секунд.
-
sec -
Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания долей секунды. Значение 0 или
nilвыполнит блок без таймаута. -
klass -
Класс исключения Exception, который будет вызван, если блок не завершится в течение
secсекунд. Если опущено, используется значение по умолчанию Timeout::Error.
Возвращает результат блока если блок был завершен до sec секунд, в противном случае генерирует исключение, в зависимости от значения klass.
Исключение, вызываемое для завершения данного блока, не может быть перехвачено внутри блока, если klass не указано явно.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вы могли вызывать его напрямую как #timeout.
Приватные методы экземпляра
# File lib/timeout.rb, line 72
def timeout(sec, klass = nil) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
message = "execution expired"
e = Error
bl = proc do |exception|
begin
x = Thread.current
y = Thread.start {
begin
sleep sec
rescue => e
x.raise e
else
x.raise exception, message
end
}
return yield(sec)
ensure
if y
y.kill
y.join # make sure y is dead.
end
end
end
if klass
begin
bl.call(klass)
rescue klass => e
bt = e.backtrace
end
else
bt = Error.catch(message, &bl)
end
rej = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-4}\z/o
bt.reject! {|m| rej =~ m}
level = -caller(CALLER_OFFSET).size
while THIS_FILE =~ bt[level]
bt.delete_at(level)
end
raise(e, message, bt)
end Выполните операцию в блоке, вызвав ошибку, если она занимает более sec секунд.
- sec
-
Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания долей секунды. Значение 0 или
nilвыполнит блок без таймаута. - klass
-
Класс исключения Exception, который будет вызван, если блок не завершится в течение
secсекунд. Если опущено, используется значение по умолчанию Timeout::Error
Возвращает результат блока если блок был завершен до sec секунд, в противном случае генерирует исключение, в зависимости от значения klass.
Исключение, вызываемое для завершения данного блока, не может быть перехвачено внутри блока, если klass не указано явно.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вы могли вызывать его напрямую как #timeout.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.