如何处理 Sinatra 中的陷阱

How to handle traps in Sinatra

我想捕获陷阱并需要在退出我的 Sinatra 应用程序之前执行自定义代码。我需要等到我的线程执行完成才能退出 Sinatra。

require 'sinatra'

trap('INT') do
 puts "Trapped"
 @th.join
 exit(99)
end

get "/test" do
 "Hello World!"
 @th = Thread.new {sleep 30}
 puts @th
end  

如果我按下 Ctrl+C 它应该等到线程完成。

您可以在应用关闭前使用 at_exit 到 运行 代码。

如果您需要在 at_exit 中使用您在 运行 之前没有的变量,您可以尝试将它们设为全局变量。例如,

thread = nil

at_exit do
  puts "Trapped"
  thread.join if thread
  exit(99)
end

require 'sinatra'
get "/test" do
  "Hello World!"
  thread = Thread.new {sleep 30}
  puts thread
end