我的腳本從redis數據庫端獲取元素,並使用它做一些工作。我需要確保如果腳本以^ C或其他信號完成,元素將返回到數據庫中。 我試圖做到這一點如何在Ruby中的陷阱環境中使用Redis調用?
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>'
你是指交易鎖定?如果是的話,你應該閱讀http://redis.io/topics/transactions – kiddorails 2015-01-04 12:54:17
@kiddorails我不使用事務,我只需要將我的應用的當前狀態保存到中斷時的redis結構中。這個錯誤似乎令人沮喪,我無法弄清楚它爲什麼會發生。 – kusayu 2015-01-04 13:01:03