модуль 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, в том числе 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().
Закрытые методы экземпляра
# 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.