модуль 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 Лаборатория прикладной связи сети, Inc.
- Авторские права
-
(C) 2000 Агентство по содействию развитию информационных технологий, Япония
Методы публичного класса
# File lib/timeout.rb, line 74
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 -
Класс исключения Exception для поднятия, если блок не завершится в
secсекунды. Пропуск значения приведет к использованию значения по умолчанию Timeout::Error. -
message -
Сообщение об ошибке для поднятия с классом исключения Exception. Пропуск значения приведет к использованию значения по умолчанию «истекло время выполнения»
Возвращает результат блока если блок завершился до sec секунд, в противном случае генерирует исключение, основанное на значении klass.
Исключение, сгенерированное для завершения заданного блока, не может быть перехвачено внутри блока, если klass не задано явно.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы у них был метод timeout, а также метод модуля, чтобы вы могли вызвать его напрямую как #timeout.
Приватные методы экземпляра
# File lib/timeout.rb, line 74
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 -
Класс исключения Exception для поднятия, если блок не завершится в
secсекунды. Пропуск значения приведет к использованию значения по умолчанию Timeout::Error. -
message -
Error сообщение для поднятия с классом исключения Exception. Пропуск значения приведет к использованию значения по умолчанию «истекло время выполнения»
Возвращает результат блока если блок завершился до 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.