На данный момент стратегия, которую я предпринимаю, состоит в том, чтобы создать экземпляр одноэлементного объекта в начале процесса загрузки, а затем использовать его для поддержки потоков.Для этого, очевидно, необходимы безопасные методы.
Файл application.rb определяет MyApp::Application
.На этом этапе я объявляю метод доступа my_thing_manager
, require my_thing_manager
и устанавливаю self.my_thing_manager = MyThingManager.instance
.
class MyThingManager
def instance
return Thread.main[:thing_manager] unless Thread.main[:thing_manager].nil?
Thread.main[:thing_manager] = self.new
end
private
def initialize
end
end
Этот подход работает в одном многопоточном процессе , но не работает в кластерной производственной среде.Для моих требований это вполне приемлемо.Для многопроцессорных приложений можно использовать ловушки, например, в Puma after_worker_fork
или Unicorn's after_fork
для управления подпиской на что-то вроде Redis pubsub.Это будет требованием для будущего проекта, поэтому я ожидаю дальнейшего развития этой стратегии.