модуль 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 Агентство по содействию информационным технологиям, Япония
Константы
- VERSION
Методы публичного класса
# File lib/timeout.rb, line 169
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
Error.handle_timeout(message, &perform)
end
end Выполнить операцию в блоке, вызвав ошибку, если она занимает более sec секунд.
-
sec -
Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. -
klass -
ExceptionClassдля повышения, если блок не завершается вsecсекунд. Пропуск значения использует значение по умолчанию,Timeout::Error. -
message -
Сообщение
Errorдля повышения сExceptionClass. Пропуск значения использует значение по умолчанию, «выполнение истекло»
Возвращает результат блока если блок был завершен до sec секунд, в противном случае генерирует исключение, основываясь на значении klass.
Исключение, сгенерированное для завершения данного блока, не может быть перехвачено внутри блока, если klass не указано явно. Однако блок может использовать ensure для предотвращения обработки исключения. По этой причине на этот метод нельзя положиться для принудительного таймаута для недоверенных блоков.
Если планировщик определен, он будет использован для обработки таймаута путем вызова Scheduler#timeout_after.
Обратите внимание, что это метод модуля Timeout, поэтому вы можете include Timeout в свои классы, чтобы они имели метод timeout, а также метод модуля, чтобы вызвать его напрямую как Timeout.timeout().
Приватные методы экземпляра
# File lib/timeout.rb, line 169
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
Error.handle_timeout(message, &perform)
end
end Выполнить операцию в блоке, вызвав ошибку, если она занимает более sec секунд.
-
sec -
Количество секунд ожидания завершения блока. Можно использовать любое число, включая числа с плавающей точкой для указания дробных секунд. Значение 0 или
nilвыполнит блок без таймаута. -
klass -
ExceptionClassдля повышения, если блок не завершается вsecсекунд. Пропуск значения использует значение по умолчанию,Timeout::Error. -
message -
Errorсообщение для повышения сExceptionClass. Пропуск значения использует значение по умолчанию, «выполнение истекло»
Возвращает результат блока если блок был завершен до 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.