我如何在Ruby中的陷阱上下文中使用Redis调用?
发布时间:2020-12-16 21:03:39 所属栏目:百科 来源:网络整理
导读:我的脚本从redis数据库端获取元素,用它做一些工作.我需要确保如果脚本使用^ C或其他Signal完成,该元素将在数据库中返回. 我正在努力做到这一点 require "redis"class Test attr_reader :quit def initialize @redis = Redis.new end def trap_signal trap("I
我的脚本从redis数据库端获取元素,用它做一些工作.我需要确保如果脚本使用^ C或其他Signal完成,该元素将在数据库中返回.
我正在努力做到这一点 require "redis" class Test attr_reader :quit def initialize @redis = Redis.new end def trap_signal trap("INT") { puts "get ready to exit" @redis.rpush "TestQueue",@elem # I need to be sure that @emelent always puts back in the database @quit = true} end def run! trap_signal @elem = "test string" @redis.rpush "TestQueue",@elem while !quit @redis.blpop "TestQueue",@elem # Do some work whith @element sleep 1 # And put it back in the database @redis.rpush "TestQueue",@elem end end end Test.new.run! 但得到这个错误 ^Cget ready to exit /usr/lib/ruby/2.1.0/monitor.rb:185:in `lock': can't be called from trap context (ThreadError) from /usr/lib/ruby/2.1.0/monitor.rb:185:in `mon_enter' from /usr/lib/ruby/2.1.0/monitor.rb:209:in `mon_synchronize' from /home/kusayu/.gem/ruby/2.1.0/gems/redis-3.2.0/lib/redis.rb:37:in `synchronize' from /home/kusayu/.gem/ruby/2.1.0/gems/redis-3.2.0/lib/redis.rb:991:in `rpush' from test.rb:13:in `block in trap_signal' from test.rb:24:in `call' from test.rb:24:in `sleep' from test.rb:24:in `run!' from test.rb:32:in `<main>' 解决方法
您的代码已经正常运行,只需从信号处理程序中删除@ redis.rpush即可.
您不应该在信号处理程序中运行“繁重”操作(并且因此无论如何都会得到异常).最好使用像@quit = true这样的变量来表示主循环是否有时间完成,然后让主循环处理正确的清理. 因此,如果您只是从INT信号处理程序中删除@ redis.rpush,那么您将确保将元素返回到数据库中,因为主循环只会在@quit为真时完成. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |