【问题标题】:Stopping a Distributed Ruby Service停止分布式 Ruby 服务
【发布时间】:2011-07-24 13:34:43
【问题描述】:

在生成处理程序对象并通过DRb.thread.join 等待之前,我有一个启动 DRb 服务的脚本。我希望脚本一直运行到被明确杀死,所以我添加了

trap "INT" do
  DRb.stop_service
end

在 Ruby 1.8 下成功停止 DRb 服务并退出,但在 1.9 下似乎死锁(在 OS X 10.6.7 上)。对进程进行采样显示semaphore_wait_signal_trap 中有几个线程在旋转。

我认为我在调用 stop_service 的方式上做错了,但我不确定是什么。谁能给我任何关于如何正确进行的指示?

【问题讨论】:

    标签: ruby distributed ruby-1.9 ruby-1.8 drb


    【解决方案1】:

    DRb.thread.join 使调用线程等待 DRb 执行线程结束。 如果您想捕捉INT 信号,我宁愿使用以下代码。

    $execute = true
    DRb.start_service
    
    Signal.trap("INT") { $execute = false }
    while $execute
      sleep 1
    end
    DRb.stop_service
    

    请注意,在这种情况下没有 DRb.thread.join。 捕获信号也是首选方法,而不是抢救中断异常。

    【讨论】:

      【解决方案2】:

      好的,我想我已经找到了解决方案。如果我用

      替换原始代码
      begin
        DRb.thread.join
      rescue Interrupt
      ensure
        DRb.stop_service
      end
      

      Ctrl-C 起作用并停止服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2016-05-05
        • 2011-09-25
        • 1970-01-01
        • 2018-04-15
        相关资源
        最近更新 更多