我写了一个 API 守护进程。它几乎不处理循环中的请求(在处理内部它可以通过http和amqp调用其他服务,重载sql数据库等)。我想找到为其优雅关闭的最佳方法。所以当它收到 sigterm 或中断时,它必须在完成当前请求处理后才退出。我不使用线程,但是我很困惑,有些库可以。像兔子一样。
所以这不是一个交易:
begin
processing @request
rescue Interrupt => _
db.close
end
我这样想:
$gameover = false
trap('INT'){ $gameover = true }
trap('TERM'){ $gameover = true }
class HardApi < Sinatra::Base
before{ lots of code }
after do
if $gameover
db.close
mq.disconnect
log.info{"The end."}
exit 0
end
end
post('/chat/:id') do |chat_id|
BabblerCtrl.new(@request).upload_file(chat_id)
MQService.publish_to_user(@client_id, chat_id, type: :service, :i_file_uploaded)
end
# etc
end
Ruby 解释器也说它不能从陷阱内部使用 Mutex。
所以我的问题是全局变量是此类标志的最佳解决方案,或者有类似信号量的东西,我可以从陷阱设置?
我编写的用于测试的简单脚本正在运行,但是我的真实程序有很多调试,我仍然不确定它是否可以在 prod 中运行。