Где находится правильное место для инициализации службы DRb в приложении Rails?
Я использую DRb в приложении Rails для разгрузки дорогостоящей задачи вне процесса Rails. Перед инициализацией клиентской заглушки с помощью DRbObject.new необходимо инициализировать службу DRb с помощью DRb.start_service.
Выполнение этого в модели или контроллере приводит к тому, что потоки остаются в неопределенном состоянии. Когда я выхожу из дворняги, он говорит:
Reaping 1 threads for slow workers because of 'shutdown'
Waiting for 1 requests to finish, could take 60 seconds.
Инициализация службы в environment.rb, кажется, работает нормально с большой оговоркой: я также использую backgroundrb с некоторыми работниками rails. Когда они инициализируются, они запускают environment.rb и снова приводят к проблемам из-за двойной инициализации.
Где находится правильное место для вызова DRb.start_service в клиенте? Или есть ли способ проверить инициализацию, чтобы я мог избежать этого дважды для одного и того же процесса?
1 ответ
Следующий код проверит, активен ли основной сервер, чтобы избежать двойной инициализации. Зависания шавки на выходе можно избежать, переместив поток DRb в группу ThreadGroup, отличную от той, которую использует шавка.
# start DRb service if it hasn't been started before
begin
DRb.current_server
rescue DRb::DRbServerNotFound
DRb.start_service
# move to different ThreadGroup to avoid mongrel hang on exit
ThreadGroup.new.add DRb.thread
end
Выполнение этого до использования класса (а не в environment.rb) дало наилучшие результаты и, похоже, прекрасно работает с backgroundrb.