加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我如何在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为真时完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读