Spec-Zone.ru › Ruby 3.4

модуль 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

Версия

Методы публичного класса

timeout (sec, klass = nil, message = nil) { |sec| ... }
Исходный код
# 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

Exception Class для вызова, если блок не завершился в течение sec секунд. Если опущено, будет использоваться значение по умолчанию: Timeout::Error.

message

Error сообщение для вызова с Exception Class. Если опущено, будет использоваться значение по умолчанию: «истечение времени выполнения»

Возвращает результат блока, если блок завершился до sec секунд, в противном случае генерирует исключение, в зависимости от значения klass.

Исключение, вызываемое для завершения данного блока, нельзя перехватить внутри блока, если явно не указано klass. Однако, блок может использовать ensure для предотвращения обработки исключения. По этой причине этот метод нельзя использовать для принудительного таймаута недоверенных блоков.

Если задан планировщик, он будет использован для обработки таймаута, вызвав Scheduler#timeout_after.

Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вызвать его напрямую как Timeout.timeout().

Методы приватного экземпляра

timeout (sec, klass = nil, message = nil) { |sec| ... }
Исходный код
# 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

Exception Class для вызова, если блок не завершился в течение sec секунд. Если опущено, будет использоваться значение по умолчанию: Timeout::Error.

message

Error сообщение для вызова с Exception Class. Если опущено, будет использоваться значение по умолчанию: «истечение времени выполнения»

Возвращает результат блока, если блок завершился до 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API