在python中的信号处理程序中唤醒阻塞redis调用

时间:2015-05-08 14:08:54

标签: python redis signals redis-py

我需要通过信号处理唤醒列表中的阻塞pop(redis客户端)(在本例中为SIGUSR1)

这是示例代码:

import redis
import signal

r = redis.Redis()

def handler(signal, frame):
    q = redis.Redis()
    q.rpush('test', 1)
    print 'sign arrived'

signal.signal(signal.SIGUSR1, handler)

print 'start'
print r.blpop('asd')
print 'end'

此代码的输出是

start
// here I send the signal with "$ kill -10 <pid>"
sign arrived

然后停止

其他信息:

  • 处理程序内部推送的结果是1(它应该意味着一个元素实际上已经插入到列表中)
  • 如果我打开一个平行的redis-cli shell,则没有显示任何元素&#34; LRANGE&#34;即使在信号处理之后
  • redis-cli命令&#34;客户列表&#34;显示了blpop客户端

有什么问题? 提前谢谢

更新

如果我复制推送,则可以工作:

def handler(signal, frame):
    q = redis.Redis()
    q.rpush('test', 1)
    q.rpush('test', 1)
    print 'sign arrived'

redis队列中似乎没有其他消息。 看起来第一次推动消失了......

0 个答案:

没有答案