停止分布式 Ruby 服务
我有一个脚本,在生成处理程序对象并通过 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
的方式做错了什么,但我不确定是什么。有人可以给我任何关于如何正确处理它的指示吗?
I have a script that starts up a DRb service, before spawning a handler object and waiting via DRb.thread.join
. I would like the script to run until explicitly killed, so I added
trap "INT" do
DRb.stop_service
end
which successfully stops the DRb service and exits under Ruby 1.8, but under 1.9 seems to deadlock (on OS X 10.6.7). Sampling the process shows a couple of threads spinning in semaphore_wait_signal_trap
.
I assume that I'm doing something wrong in the way I'm calling stop_service
, but I'm not sure what. Could anyone give me any pointers around how to correctly go about it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好吧,我想我已经找到了解决方案。如果我用 Ctrl-C 替换原始代码
,则可以运行并停止服务。
Okay, I think I have found the solution. If I replace the original code with
The Ctrl-C works and stops the service.
DRb.thread.join 使调用线程等待 DRb 执行线程结束。
如果您想捕获 INT 信号,我宁愿使用以下代码。
请注意,在这种情况下没有
DRb.thread.join
。捕获信号也是首选方法,而不是拯救中断异常。
DRb.thread.join
makes the calling thread wait for DRb execution thread to end.If you want to catch
INT
signal I'd rather go with the following code instead.Note that there is no
DRb.thread.join
in this case.Also catching the signal is the preferred way instead of rescuing the Interrupt exception.