модуль 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 75
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 не указано явно.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вызвать его напрямую как Timeout.timeout().
Приватные методы экземпляра
# File lib/timeout.rb, line 75
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 не указано явно.
Обратите внимание, что это метод модуля 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.