Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 终止时终止所有线程_Ruby_Multithreading - Fatal编程技术网

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

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