Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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和Redis,线程不处理命令_Ruby_Multithreading_Redis - Fatal编程技术网

Ruby和Redis,线程不处理命令

Ruby和Redis,线程不处理命令,ruby,multithreading,redis,Ruby,Multithreading,Redis,我正在使用redis和ruby,并试图在线程中发出一个blpop,这样我就可以等待列表中的传入项 问题是blpop的块中的代码似乎从未被调用。下面是我正在运行的示例代码(ruby 1.9.3): 非常感谢您的帮助 谢谢你的回复。我尝试了你的代码,但仍然收到@消息返回nil。另外,我不确定为什么在方法中声明实例变量是一种不好的做法。你能进一步解释吗?嗯。。。原因方法不是实例。。。我想是吧。我不是专家,但我相信它们应该只用于对象。无论如何,在我看来,“r”是空的,所以blpop不应该一直等到列表中有

我正在使用redis和ruby,并试图在线程中发出一个
blpop
,这样我就可以等待列表中的传入项

问题是
blpop
的块中的代码似乎从未被调用。下面是我正在运行的示例代码(ruby 1.9.3):


非常感谢您的帮助

谢谢你的回复。我尝试了你的代码,但仍然收到
@消息
返回
nil
。另外,我不确定为什么在方法中声明实例变量是一种不好的做法。你能进一步解释吗?嗯。。。原因方法不是实例。。。我想是吧。我不是专家,但我相信它们应该只用于对象。无论如何,在我看来,“r”是空的,所以blpop不应该一直等到列表中有东西要弹出吗?这是正确的,直到创建线程之后,当我们在它之后执行
redis.rpush“test”,“hello world”
。至少,当我在看redis控制台的时候,我能看到这一点。哦。。。这里是错误。您正在推送到一个不同的列表:)
redis.rpush“test”,“hello world”
其中
“test”
是推送到的关键。
require 'rubygems'
require 'redis'

def start_thread
  @thread = Thread.new do
    r = Redis.new
    key, message = r.blpop(:test, 0)
    process_message(key, message)
  end
  redis = Redis.new
  redis.rpush :test, "hello world"
end

def process_message(key, message)
  @message = "#{key} was sent #{message}"
end

start_thread
@thread.join
p @message
require 'rubygems'
require 'redis'

def start_thread
  @thread = Thread.new do
    r = Redis.new
    key, message = r.blpop(:test, 0)
    process_message(key, message)
  end
  redis = Redis.new
  redis.rpush :test, "hello world"
end

def process_message(key, message)
  @message = "#{key} was sent #{message}"
end

start_thread
@thread.join
p @message