2

我在 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 中初始化服务似乎可以正常工作,但有一个很大的警告:我也在使用 backgroundrb 和一些 rails 工作人员。当它们初始化时,它们运行 environment.rb 并再次由于双重初始化而导致问题。

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

4

1 回答 1

3

以下代码将检查主服务器是否已经处于活动状态以避免重复初始化。通过将 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 一起工作得很好。

于 2008-11-18T18:50:34.657 回答