停止分布式 Ruby 服务

发布于 2024-10-28 01:20:21 字数 343 浏览 6 评论 0原文

我有一个脚本,在生成处理程序对象并通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╰つ倒转 2024-11-04 01:20:21

好吧,我想我已经找到了解决方案。如果我用 Ctrl-C 替换原始代码

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

,则可以运行并停止服务。

Okay, I think I have found the solution. If I replace the original code with

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

The Ctrl-C works and stops the service.

萌吟 2024-11-04 01:20:21

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
捕获信号也是首选方法,而不是拯救中断异常。

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.

$execute = true
DRb.start_service

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文