我有一点代码:

require 'em-synchrony'
require 'em-synchrony/em-hiredis'

EventMachine.synchrony do
  redis = EventMachine::Hiredis::Client.connect
  puts redis.class.name

  redis.set('a', 'foo')
  puts redis.get('a') == 'foo' ## should be 'true'
  puts redis.get('c').nil?     ## should be 'true'

  EM.stop
end

如果将其存储在/tmp/reddy.rb的文件系统中,则执行以下操作:
$ ruby /tmp/reddy.rb
EventMachine::Hiredis::Client
false
false

在这两种情况下都返回aDefaultDeferrable。稍加修改
puts EM::Synchrony.sync( redis.get('a') )

按预期返回'foo'。现在,真正让我困惑的是,如果你看一下em-synchrony/em-hiredis我包括你会发现em::hiredis::client很短:
class Client
  def self.connect(host = 'localhost', port = 6379)
    conn = new(host, port)
    EM::Synchrony.sync conn.connect
    conn
  end

  alias :old_method_missing :method_missing
  def method_missing(sym, *args)
    EM::Synchrony.sync old_method_missing(sym, *args)
  end
end

也就是说,应该已经调用了em::synchrony.sync,但似乎没有调用。我忽略了什么?为什么所列出的代码位的行为不像em synchrony文档所建议的那样?
我在用
EM-同步-1.0.0
事件机器-0.12.10
EM-HIREDIS-0.1.0公司
Ruby1.9.3p0(2011-10-30版本33570)[i686Linux]
我知道redis-rb但更喜欢em-hiredis因为它是pub/sub实现。

最佳答案

结果,em synchrony没有正确地给em hiredis打补丁。也就是说,您看到的客户机定义不存在于当前版本的em synchrony中,只存在于开发头中。

关于ruby - 为什么这个EventMachine Synchrony hiredis示例返回DefaultDefferable而不是请求中的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8737652/

10-15 10:08