シグナル処理 (この場合は SIGUSR1) を介してリストでブロックされた pop (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
そして停止
その他の情報:
- ハンドラー内のプッシュの結果は 1 です (要素が実際にリストに挿入されたことを意味するはずです)
- 並列 redis-cli シェルを開くと、シグナル処理の後でも「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 キューの最後に他のメッセージは表示されません。初押しが消えそう…