модуль Timeout
Timeout длительных блоков
Краткое описание
require 'timeout'
status = Timeout.timeout(5) {
# Something that should be interrupted if it takes more than 5 seconds...
}
Описание
Timeout предоставляет способ автоматического завершения потенциально длительной операции, если она не завершилась в заданное время.
Авторские права
- Авторские права
-
© 2000 Network Applied Communication Laboratory, Inc.
- Авторские права
-
© 2000 Information-technology Promotion Agency, Japan
Константы
- VERSION
-
Версия
Методы публичного класса
Исходный код
# File lib/timeout.rb, line 167
def timeout(sec, klass = nil, message = nil, &block) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
raise ArgumentError, "Timeout sec must be a non-negative number" if 0 > sec
message ||= "execution expired"
if Fiber.respond_to?(:current_scheduler) && (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
return scheduler.timeout_after(sec, klass || Error, message, &block)
end
Timeout.ensure_timeout_thread_created
perform = Proc.new do |exc|
request = Request.new(Thread.current, sec, exc, message)
QUEUE_MUTEX.synchronize do
QUEUE << request
CONDVAR.signal
end
begin
return yield(sec)
ensure
request.finished
end
end
if klass
perform.call(klass)
else
Error.handle_timeout(message, &perform)
end
end Выполняет операцию в блоке, вызывая ошибку, если выполнение занимает более sec секунд.
sec-
Количество секунд ожидания завершения блока. Можно использовать любое неотрицательное число или nil, включая числа с плавающей запятой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. Любое отрицательное число вызоветArgumentError. klass-
ExceptionClassдля вызова, если блок не завершился в течениеsecсекунд. Если опущено, будет использоваться значение по умолчанию:Timeout::Error. message-
Errorсообщение для вызова сExceptionClass. Если опущено, будет использоваться значение по умолчанию: «истечение времени выполнения»
Возвращает результат блока, если блок завершился до sec секунд, в противном случае генерирует исключение, в зависимости от значения klass.
Исключение, вызываемое для завершения данного блока, нельзя перехватить внутри блока, если явно не указано klass. Однако, блок может использовать ensure для предотвращения обработки исключения. По этой причине этот метод нельзя использовать для принудительного таймаута недоверенных блоков.
Если задан планировщик, он будет использован для обработки таймаута, вызвав Scheduler#timeout_after.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вызвать его напрямую как Timeout.timeout().
Методы приватного экземпляра
Исходный код
# File lib/timeout.rb, line 167
def timeout(sec, klass = nil, message = nil, &block) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
raise ArgumentError, "Timeout sec must be a non-negative number" if 0 > sec
message ||= "execution expired"
if Fiber.respond_to?(:current_scheduler) && (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
return scheduler.timeout_after(sec, klass || Error, message, &block)
end
Timeout.ensure_timeout_thread_created
perform = Proc.new do |exc|
request = Request.new(Thread.current, sec, exc, message)
QUEUE_MUTEX.synchronize do
QUEUE << request
CONDVAR.signal
end
begin
return yield(sec)
ensure
request.finished
end
end
if klass
perform.call(klass)
else
Error.handle_timeout(message, &perform)
end
end Выполняет операцию в блоке, вызывая ошибку, если выполнение занимает более sec секунд.
sec-
Количество секунд ожидания завершения блока. Можно использовать любое неотрицательное число или nil, включая числа с плавающей запятой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. Любое отрицательное число вызоветArgumentError. klass-
ExceptionClassдля вызова, если блок не завершился в течениеsecсекунд. Если опущено, будет использоваться значение по умолчанию:Timeout::Error. message-
Errorсообщение для вызова сExceptionClass. Если опущено, будет использоваться значение по умолчанию: «истечение времени выполнения»
Возвращает результат блока, если блок завершился до sec секунд, в противном случае генерирует исключение, в зависимости от значения klass.
Исключение, вызываемое для завершения данного блока, нельзя перехватить внутри блока, если явно не указано klass. Однако, блок может использовать ensure для предотвращения обработки исключения. По этой причине этот метод нельзя использовать для принудительного таймаута недоверенных блоков.
Если задан планировщик, он будет использован для обработки таймаута, вызвав Scheduler#timeout_after.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вызвать его напрямую как Timeout.timeout().
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.