Spec-Zone.ru › Ruby 3

модуль 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 Агентство по содействию информационным технологиям, Япония

Константы

VERSION

Публичные методы класса

timeout(sec, klass = nil, message = nil) { |sec| ... } Показать исходный код
# File lib/timeout.rb, line 79
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

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

message

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

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

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

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

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

timeout(sec, klass = nil, message = nil) { |sec| ... } Показать исходный код
# File lib/timeout.rb, line 79
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

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

message

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

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

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

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

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

Spec-Zone.ru

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