【发布时间】:2020-05-27 15:47:47
【问题描述】:
我想捕获陷阱并且需要在退出我的 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 它应该等到线程完成。
【问题讨论】:
-
那么什么不起作用?
-
如果我按下 Ctrl+C 它会立即终止,这就是 sinatra 通常的工作方式,我需要为我的 sinatra 应用程序使用自定义陷阱。
-
不抓陷阱,你试过
at_exit吗? -
我不能将 thread.join 与 at_exit 一起使用,因为变量没有被转移到 at_exit 函数 undefined method `join' for nil:NilClass (NoMethodError) - 我在“get /测试”调用
-
那是因为
at_exit不会继承 Sinatra 应用程序的实例变量。尝试在at_exit函数之前设置thread=nil,然后改为使用thread = Thread.new { … }