我在rails应用程序中使用drb来卸载rails进程之外的昂贵任务。在用drbobject.new初始化客户端存根之前,必须用drb.start_服务初始化drb服务。
在模型或控制器中执行此操作似乎会使线程处于不确定状态。当我离开杂种狗时,它会说:
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_服务的正确位置是哪里?或者,有没有一种方法可以测试初始化,这样我就可以避免在同一个进程中进行两次呢?

最佳答案

以下代码将检查主服务器是否已处于活动状态,以避免双重初始化。通过将drb线程移动到不同于mongrel正在使用的线程组,可以避免mongrel挂起退出。

    # 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中运行起来似乎很好。

关于ruby-on-rails - 在Rails应用程序中初始化DRb服务的正确位置在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/299219/

10-13 09:34