2

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

这是示例代码:

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

并停止

其他信息:

  • 处理程序内部 push 的结果是 1 (这应该意味着一个元素实际上已经插入到列表中)
  • 如果我打开一个并行的 redis-cli shell,即使在信号处理之后,也不会显示带有“LRANGE”的元素
  • redis-cli 命令“CLIENT LIST”显示 blpop 客户端

怎么了?提前致谢


更新

如果我复制推送,则有效:

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

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

4

0 回答 0