gpt4 book ai didi

ruby - 终止时杀死所有线程

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:53 25 4
gpt4 key购买 nike

我正在尝试用 ruby​​ 创建一个可以从命令行启动的应用程序,它做了两件事:运行一个连续的作业(loopsleep 运行一些 Action [远程提要解析]) 在一个线程中,在第二个线程中使用 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 }

上面的代码实际上很好地完成了它的工作 - sinatra 应用程序在 4567 端口下启动并且 do something heavy 任务每 10 秒被触发一次。但是,我无法终止该脚本。

我用 ruby app.rb 运行它,但用 ctrl + c 关闭它是行不通的。它只终止了 sinatra 线程,但第二个线程仍在运行,要停止脚本,我需要关闭终端窗口。

我试图杀死 SIGNINT 上的所有线程,但它也没有按预期工作

trap "SIGINT" do
puts "Exiting"
threads.each { |t| Thread.kill t }
exit 130
end

你能帮我解决这个问题吗?提前致谢。

最佳答案

要捕获 ctrl-c,请将“SIGINT”更改为“INT”。

trap("INT") {
puts "trapping"
threads.each{|t|
puts "killing"
Thread.kill t
}
}

配置 Sinatra 跳过捕获陷阱:

class MyApp < Sinatra::Base
configure do
set :traps, false
end
...

引用: ruby Signal module

列出可用的 Ruby 信号:Signal.list.keys

引用:Sinatra Intro

(当我运行您的代码并捕获 INT 时,我确实收到 Sinatra 套接字警告“已在使用中”。我认为这对您的目的来说没问题,或者您可以通过正常关闭 Sinatra 来解决这个问题。参见 Sinatra - terminate server from request )

关于ruby - 终止时杀死所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27642943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com