модуль ActiveSupport::PerThreadRegistry
ПРИМЕЧАНИЕ: Этот подход устарел для кода конечного пользователя в пользу thread_mattr_accessor и аналогичных методов. Используйте этот подход вместо него.
Этот модуль используется для инкапсуляции доступа к переменным потоков.
Вместо загрязнения пространства имён потоковых локальных переменных:
Thread.current[:connection_handler]
вы определяете класс, который расширяет этот модуль:
module ActiveRecord
class RuntimeRegistry
extend ActiveSupport::PerThreadRegistry
attr_accessor :connection_handler
end
end
и вызываете объявленные аксессоры экземпляра как методы класса. Таким образом
ActiveRecord::RuntimeRegistry.connection_handler = connection_handler
устанавливает обработчик соединения, локальный для текущего потока, и
ActiveRecord::RuntimeRegistry.connection_handler
возвращает обработчик соединения, локальный для текущего потока.
Эта функция выполняется путём создания экземпляра класса и хранения экземпляра в качестве локальной переменной потока, ключом которого является имя класса. В приведённом выше примере ключ «ActiveRecord::RuntimeRegistry» хранится в Thread.current. Методы класса делегируют вызовы указанному экземпляру локальной переменной потока.
Если у класса есть инициализатор, он должен принимать ноль аргументов.
Общедоступные методы класса
# File activesupport/lib/active_support/per_thread_registry.rb, line 42 def self.extended(object) object.instance_variable_set :@per_thread_registry_key, object.name.freeze end
Общедоступные методы экземпляра
# File activesupport/lib/active_support/per_thread_registry.rb, line 46 def instance Thread.current[@per_thread_registry_key] ||= new end
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.