我在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的正确位置在哪里?或者,有没有办法测试初始化,所以我可以避免为同一个过程做两次?
答案 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一起正常工作。