2

シグナル処理 (この場合は 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 キューの最後に他のメッセージは表示されません。初押しが消えそう…

4

0 に答える 0