发布到redis阻止了我的进程

时间:2014-04-22 08:07:50

标签: ruby redis

这是我的红宝石代码:

require 'redis'
redis = Redis.new

Thread.new do
  redis.subscribe('foo_bar') do |on|
    on.message do |key, id|
      puts id
    end
  end
end

redis.publish('foo_bar', 1337)

有谁能告诉我,为什么最后一行的“发布”指令会阻止我的进程?

由于

2 个答案:

答案 0 :(得分:1)

redis.subscribe似乎在整个过程中阻止了redis访问。因此,当您尝试发布它时,锁定。

解决方案:尝试使用轮询代替subscribe

解决方案2:使用多个REDIS连接,即创建REDIS连接池

答案 1 :(得分:0)

首先,发布不会阻止该过程。

require 'redis'
redis = Redis.new

Thread.new do
  redis.subscribe('foo_bar') do |on|
    on.message do |key, id|
      puts id
    end
  end
end

redis.publish('foo_bar', 1337)

应输出:

1337

而且,

require 'redis'
redis = Redis.new

Thread.new do
  redis.subscribe('foo_bar') do |on|
    on.message do |key, id|
      puts id
    end
  end
end

redis.publish('foo_bar', 1337)
redis.publish('foo_bar', 1338)

输出:

1337
1338

在pub / sub系统中,发布者推送消息,订阅者是一个始终阻塞的同步过程。 Publisher始终是异步的。