在Rails应用程序中初始化DRb服务的正确位置在哪里?

时间:2008-11-18 16:10:26

标签: ruby-on-rails ruby backgroundrb drb

我在Rails应用程序中使用DRb来卸载Rails进程之外的昂贵任务。在使用DRbObject.new初始化客户端存根之前,必须使用DRb.start_service初始化DRb服务。

在模型或控制器中执行此操作似乎会使线程处于不确定状态。当我退出杂种时,它说:

Reaping 1 threads for slow workers because of 'shutdown' Waiting for 1 requests to finish, could take 60 seconds.

在environment.rb中初始化服务似乎工作得很好但有一点需要注意:我也在使用带有一些rails worker的backgroundrb。当他们初始化时,他们运行environment.rb并再次因双重初始化而导致问题。

在客户端中调用DRb.start_service的正确位置在哪里?或者,有没有办法测试初始化​​,所以我可以避免为同一个过程做两次?

1 个答案:

答案 0 :(得分:3)

以下代码将检查主服务器是否已处于活动状态以避免双重初始化。通过将DRb线程移动到与正在使用的mongrel不同的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一起正常工作。