Ruby 终止时终止所有线程
我正在尝试用ruby创建一个应用程序,它可以从命令行启动,它可以做两件事:用一个线程运行一个连续的作业(Ruby 终止时终止所有线程,ruby,multithreading,Ruby,Multithreading,我正在尝试用ruby创建一个应用程序,它可以从命令行启动,它可以做两件事:用一个线程运行一个连续的作业(循环和睡眠运行一些操作[远程提要解析]),在第二个线程中运行sinatra。我的代码(简化)如下所示: require 'sinatra' class MyApp < Sinatra::Base get '/' do "Hello!" end end threads = [] threads << Thread.new do loop do
循环
和睡眠
运行一些操作[远程提要解析]),在第二个线程中运行sinatra。我的代码(简化)如下所示:
require 'sinatra'
class MyApp < Sinatra::Base
get '/' do
"Hello!"
end
end
threads = []
threads << Thread.new do
loop do
# do something heavy
sleep 10
end
end
threads << Thread.new do
MyApp.run!
end
threads.each { |t| t.join }
你能帮我吗?提前感谢。要捕获ctrl-c,请将“SIGINT”更改为“INT”
要将Sinatra配置为跳过捕捉陷阱,请执行以下操作:
class MyApp < Sinatra::Base
configure do
set :traps, false
end
...
classmyapp
参考:Ruby
要列出可用的Ruby信号:Signal.list.keys
参考:
(当我运行你的代码和trap INT时,我确实收到一个Sinatra套接字警告“已在使用中”。我认为这对你的目的来说是好的,或者你可以通过执行Sinatra优雅的关闭来解决这个问题。请参阅),但是trap有一个很大的缺点-它会被Web服务器覆盖。例如,美洲狮设置了几个陷阱,基本上使你的一个永远不会被调用
最好的解决方法是在_exit处使用
,可以多次定义,Ruby确保调用所有块。我还没有测试它是否适用于您的案例。您是否看到放置“退出”
的输出?不幸的是,我不知道这显然意味着您的陷阱不起作用。作为补充说明,我建议通过thread.exit
退出线程,而不是thread.kill(thread)
-这更简洁。尝试添加以下行:thread.abort\u on_exception=true
此外,如果这不起作用,我会在将SIGNINT更改为INT之后尝试:trap('INT'){exit!}
,按下ctrl+c键后,我得到的结果是,^c==Sinatra已经结束了他的设置(观众鼓掌)
,我仍然无法终止该设置bastard@mbajur似乎sinatra在到达您的信号之前捕获了信号,所以您可能希望set:trap,false
在配置
块中,我为您添加了Sinatra代码-它与@bjhaid建议的代码相同,除了复数“陷阱”。
trap("INT") {
puts "trapping"
threads.each{|t|
puts "killing"
Thread.kill t
}
}
class MyApp < Sinatra::Base
configure do
set :traps, false
end
...