gpt4 book ai didi

ruby - 启动和停止 Ruby 守护进程

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:04 25 4
gpt4 key购买 nike

我正在尝试使用 daemons gem 启动和停止无限循环守护进程。

查看 home page ,我试过(在 irb 中):

require 'daemons'
=>true
task_handle = Daemons.call do
loop{
sleep 10
puts "foo"
}
end
=> #<Daemons::Application:0x000000043f96d0 ...
task_handle.stop
=> nil
task_handle2 = Daemons.call do
loop{
sleep 10
puts "bar"
}
end

=>Daemons::RuntimeException: there is already one or more instance(s) of the program running
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons/application_group.rb:125:in `new_application'
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons.rb:251:in `call'
from (irb):21

现在,我正在查看的确切示例(链接页面上的#3)使用选项 :multiple => true 进行了第一次调用,但我真的只需要一个守护进程一次运行(事实上,多个运行是不可取的)。

第一个守护进程是否仍然存在并且没有被 GC 处理?如果是这样,我错过了什么?

最佳答案

我认为这里的误解是守护进程没有按顺序运行。就它们的性质而言,它们并行运行,它们之间几乎没有协调。我相信您可以找到 System V IPC 信号量的 Ruby 接口(interface)来协调它们,但如果您想要作业队列,请查看守护进程以外的东西。

此外,要添加到上面@Sigurd 的回答中,这里是实现 :force 选项的相关代码(方便地未记录)(source):

115: if @applications.size > 0 and not @multiple
116: if options[:force]
117: @applications.delete_if {|a|
118: unless a.running?
119: a.zap
120: true
121: end
122: }
123: end
124:
125: raise RuntimeException.new('there is already one or more instance(s) of the program running') unless @applications.empty?
126: end

所以基本上,(zap,正如我在源代码中发现的那样,绝对没有),当您指定 :force 时,守护进程将如果未设置多个,则从 @applications 中删除所有未运行的应用程序。否则,你会得到一个错误。所以这意味着,如果您不指定 :force:multiple,那么您将单向出错。

注意:所有这一切的原因是 Application#stop 没有从 ApplicationGroup(负责创建新作业)中删除守护进程。

注意:顺便说一句,在 Ruby 中,将 {} 用于多行 block 是一种错误的形式。仅对单行 block 使用 {}。使用 do...end 代替多行。

关于ruby - 启动和停止 Ruby 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12380405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com