Spec-Zone.ru › Ruby 3.2

модуль Timeout

Timeout длительных блоков

Синопсис

require 'timeout'
status = Timeout::timeout(5) {
  # Something that should be interrupted if it takes more than 5 seconds...
}

Описание

Timeout предоставляет способ автоматического прерывания потенциально длительной операции, если она не завершилась в заданное время.

Предыдущие версии не использовали модуль для именования пространства имён, однако timeout предоставлен для обратной совместимости. Вы должны предпочесть Timeout.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 172
def timeout(sec, klass = nil, message = nil, &block)   #:yield: +sec+
  return yield(sec) if sec == nil or sec.zero?

  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
    backtrace = Error.catch(&perform)
    raise Error, message, backtrace
  end
end

Выполните операцию в блоке, вызвав ошибку, если она занимает более sec секунд.

sec

Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания долей секунд. Значение 0 или nil выполнит блок без таймаута.

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 172
def timeout(sec, klass = nil, message = nil, &block)   #:yield: +sec+
  return yield(sec) if sec == nil or sec.zero?

  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
    backtrace = Error.catch(&perform)
    raise Error, message, backtrace
  end
end

Выполните операцию в блоке, вызвав ошибку, если она занимает более sec секунд.

sec

Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания долей секунд. Значение 0 или nil выполнит блок без таймаута.

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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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