我有一个启动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
的方式上做错了,但我不确定是什么。谁能给我任何关于如何正确处理它的指示?
答案 0 :(得分:6)
好的,我想我找到了解决方案。如果我用
替换原始代码begin
DRb.thread.join
rescue Interrupt
ensure
DRb.stop_service
end
Ctrl-C可以工作并停止服务。
答案 1 :(得分: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
。
同时捕获信号是首选方法,而不是挽救中断异常。