класс Rack::Reloader
Высокопроизводительный перезагрузчик исходного кода
Этот класс работает как промежуточное ПО Rack.
Для использования в производственной среде он особенно подходит благодаря тому, что каждый файл проверяется только один раз и выполняется только один системный вызов stat(2).
Обратите внимание: файлы не перезагружаются в фоновом режиме — это происходит только при активном вызове.
В начале каждого запроса выполняется цикл проверки и перезагрузки, но также соблюдается период ожидания, в течение которого никаких действий не выполняется.
Открытые методы класса
# 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 Открытые методы экземпляра
# 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 # 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 # 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.