Где находится правильное место для инициализации службы DRb в приложении Rails? - PullRequest
2 голосов
/ 18 ноября 2008

Я использую 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 Ответ

3 голосов
/ 18 ноября 2008

Следующий код проверит, активен ли основной сервер, чтобы избежать двойной инициализации. Можно избежать зависания шавки на выходе, переместив поток DRb в группу нитей, отличную от той, которую использует шавка.

    # 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.

...