модуль Timeout
Timeout длительных блоков
Краткое описание
require 'timeout'
status = Timeout::timeout(5) {
# Something that should be interrupted if it takes more than 5 seconds...
}
Описание
Timeout предоставляет способ автоматического завершения потенциально длительной операции, если она не завершилась в определенный промежуток времени.
Предыдущие версии не использовали модуль для именования пространства, однако timeout предоставляется для обратной совместимости. Вместо этого следует использовать Timeout.timeout.
Авторские права
- Авторские права
-
(C) 2000 Network Applied Communication Laboratory, Inc.
- Авторские права
-
(C) 2000 Information-technology Promotion Agency, Japan
Публичные методы класса
# File lib/timeout.rb, line 77
def timeout(sec, klass = nil, message = nil) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
message ||= "execution expired".freeze
from = "from #{caller_locations(1, 1)[0]}" if $DEBUG
e = Error
bl = proc do |exception|
begin
x = Thread.current
y = Thread.start {
Thread.current.name = from
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
level = -caller(CALLER_OFFSET).size-2
while THIS_FILE =~ bt[level]
bt.delete_at(level)
end
raise(e, message, bt)
end Выполнить операцию в блоке, выбросив ошибку, если выполнение займёт более sec секунд.
-
sec -
Количество секунд для ожидания завершения блока. Может быть использовано любое число, включая числа с плавающей запятой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. -
klass -
ExceptionClassдля выброса, если блок не завершится в течениеsecсекунд. Пропуск значения использует по умолчаниюTimeout::Error. -
message -
Errorсообщение для выброса вместе сExceptionClass. Пропуск значения использует по умолчанию «выполнение истекло»
Возвращает результат блока если блок завершился до sec секунд, иначе генерирует исключение, основанное на значении klass.
Исключение, выброшенное для завершения заданного блока, не может быть перехвачено внутри блока, если klass не задано явно. Однако блок может использовать ensure для предотвращения обработки исключения. По этой причине на этом методе нельзя полагаться для принудительного применения таймаутов для недоверенных блоков.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы у них был метод timeout, а также метод модуля, чтобы вы могли вызывать его напрямую как Timeout.timeout().
Приватные методы экземпляра
# File lib/timeout.rb, line 77
def timeout(sec, klass = nil, message = nil) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
message ||= "execution expired".freeze
from = "from #{caller_locations(1, 1)[0]}" if $DEBUG
e = Error
bl = proc do |exception|
begin
x = Thread.current
y = Thread.start {
Thread.current.name = from
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
level = -caller(CALLER_OFFSET).size-2
while THIS_FILE =~ bt[level]
bt.delete_at(level)
end
raise(e, message, bt)
end Выполнить операцию в блоке, выбросив ошибку, если выполнение займёт более sec секунд.
-
sec -
Количество секунд для ожидания завершения блока. Может быть использовано любое число, включая числа с плавающей запятой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. -
klass -
ExceptionClassдля выброса, если блок не завершится в течениеsecсекунд. Пропуск значения использует по умолчаниюTimeout::Error. -
message -
Errorсообщение для выброса вместе сExceptionClass. Пропуск значения использует по умолчанию «выполнение истекло»
Возвращает результат блока если блок завершился до sec секунд, иначе генерирует исключение, основанное на значении klass.
Исключение, выброшенное для завершения заданного блока, не может быть перехвачено внутри блока, если klass не задано явно. Однако блок может использовать ensure для предотвращения обработки исключения. По этой причине на этом методе нельзя полагаться для принудительного применения таймаутов для недоверенных блоков.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы у них был метод timeout, а также метод модуля, чтобы вы могли вызывать его напрямую как Timeout.timeout().
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.