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, в том числе Float для задания дробного количества секунд. Значение 0 или nil позволяет выполнить блок без ограничения по времени. При указании отрицательного числа будет вызвано исключение ArgumentError.

klass

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

message

Сообщение Error, которое будет передано исключению класса Exception. Если не указать значение, будет использовано сообщение по умолчанию «execution expired»

Возвращает результат блока, если блок завершился раньше, чем через 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, в том числе Float для задания дробного количества секунд. Значение 0 или nil позволяет выполнить блок без ограничения по времени. При указании отрицательного числа будет вызвано исключение ArgumentError.

klass

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

message

Сообщение Error, которое будет передано исключению класса Exception. Если не указать значение, будет использовано сообщение по умолчанию «execution expired»

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

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

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

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

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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