6

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

trap "INT" do
  DRb.stop_service
end

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

我认为我打电话的方式有问题stop_service,但我不确定是什么。谁能给我任何关于如何正确进行的指示?

4

2 回答 2

6

好的,我想我已经找到了解决方案。如果我将原始代码替换为

begin
  DRb.thread.join
rescue Interrupt
ensure
  DRb.stop_service
end

Ctrl-C 工作并停止服务。

于 2011-06-18T10:03:22.123 回答
0

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 在这种情况下没有。捕获信号也是首选方法,而不是抢救中断异常。

于 2012-04-29T09:04:59.780 回答