【问题标题】:How to handle traps in Sinatra如何处理 Sinatra 中的陷阱
【发布时间】: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 { … }

标签: ruby sinatra


【解决方案1】:

您可以使用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  

【讨论】:

  • 要求 'sinatra' 必须在定义 at_exit 之后
  • 有趣,好吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2013-04-13
  • 2018-08-09
相关资源
最近更新 更多