我需要通过信号处理(在本例中为 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 队列中似乎没有其他消息最后出现。看起来第一次推动消失了......