Spec-Zone.ru › Ruby / Rack

класс Rack::Reloader

Высокопроизводительный перезагрузчик исходного кода

Этот класс работает как промежуточное ПО Rack.

Для использования в производственной среде он особенно подходит благодаря тому, что каждый файл проверяется только один раз и выполняется только один системный вызов stat(2).

Обратите внимание: файлы не перезагружаются в фоновом режиме — это происходит только при активном вызове.

В начале каждого запроса выполняется цикл проверки и перезагрузки, но также соблюдается период ожидания, в течение которого никаких действий не выполняется.

Открытые методы класса

new (app, cooldown = 10, backend = Stat) Показать исходный код
# File lib/rack/reloader.rb, line 25
def initialize(app, cooldown = 10, backend = Stat)
  @app = app
  @cooldown = cooldown
  @last = (Time.now - cooldown)
  @cache = {}
  @mtimes = {}
  @reload_mutex = Mutex.new

  extend backend
end

Открытые методы экземпляра

call (env) Показать исходный код
# File lib/rack/reloader.rb, line 36
def call(env)
  if @cooldown and Time.now > @last + @cooldown
    if Thread.list.size > 1
      @reload_mutex.synchronize{ reload! }
    else
      reload!
    end

    @last = Time.now
  end

  @app.call(env)
end
reload! (stderr = $stderr) Показать исходный код
# File lib/rack/reloader.rb, line 50
def reload!(stderr = $stderr)
  rotation do |file, mtime|
    previous_mtime = @mtimes[file] ||= mtime
    safe_load(file, mtime, stderr) if mtime > previous_mtime
  end
end
safe_load (file, mtime, stderr = $stderr) Показать исходный код
# File lib/rack/reloader.rb, line 58
def safe_load(file, mtime, stderr = $stderr)
  load(file)
  stderr.puts "#{self.class}: reloaded `#{file}'"
  file
rescue LoadError, SyntaxError => ex
  stderr.puts ex
ensure
  @mtimes[file] = mtime
end

Безопасный вызов Kernel::load с запуском хуков в зависимости от результата

© 2007-2021 Leah Neukirchen
Licensed under the MIT License.

Spec-Zone.ru

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