redis-pyはノンブロッキングget_message()
を使用することをお勧めします。しかし、スレッドを簡単に使用する方法も提供します。
https://pypi.python.org/pypi/redis
メッセージを読むための3つの異なる戦略があります。
シーンの裏側で、get_message()はシステムの 'select'モジュールを使用して接続のソケットをすばやくポーリングします。読み込み可能なデータがある場合、get_message()はそれを読み込み、メッセージをフォーマットして返すか、メッセージハンドラに渡します。読み込むデータがない場合、get_message()はただちにNoneを返します。これにより、アプリケーション内の既存のイベントループに統合するのが簡単になります。
while True:
message = p.get_message()
if message:
# do something with the message
time.sleep(0.001) # be nice to the system :)
古いバージョンのredis-pyは、pubsub.listen()でメッセージを読み取ります。 listen()は、メッセージが利用可能になるまでブロックするジェネレータです。アプリケーションがredisから受信したメッセージを受信して処理する必要がない場合、listen()は簡単に実行を開始する方法です。
for message in p.listen():
# do something with the message
3番目のオプションは、別のスレッドでイベントループを実行します。 pubsub.run_in_thread()は新しいスレッドを作成し、イベントループを開始します。スレッドオブジェクトはrun_in_thread()の呼び出し側に返されます。呼び出し元は、thread.stop()メソッドを使用してイベントループとスレッドをシャットダウンできます。背後では、これは別のスレッドで実行されるget_message()のラッパーです。本質的に小さな非ブロッキングイベントループを作成します。 run_in_thread()はオプションのsleep_time引数をとります。指定された場合、イベントループは、ループの各繰り返しで値を指定してtime.sleep()を呼び出します。
注:別のスレッドで実行されているため、登録されたメッセージハンドラでは自動的に処理されないメッセージは処理できません。したがって、メッセージハンドラが添付されていないパターンやチャンネルを購読している場合、redis-pyはrun_in_thread()を呼び出さないようにします。
p.subscribe(**{'my-channel': my_handler})
thread = p.run_in_thread(sleep_time=0.001)
# the event loop is now running in the background processing messages
# when it's time to shut it down...
thread.stop()
ですから、メッセージが届いたかどうかを知りたいときだけGET_MESSAGEをチェックし、あなたの質問に答えます。
聴いてブロックしたくない理由はありますか? Redis接続はかなり安く、一般的にはそれらのいくつかを生成するのが一般的です。 –
Redis、ZMQ、Tornadoを使用したPythonの非同期PubSub - https://github.com/abhinavsingh/async_pubsub –
.listen()の代わりにpubsubオブジェクトの.get_message()メソッドを使用します(以下の例があります)。 [この質問が投稿されたとき、そのメソッドはPython Redisドライバでサポートされていない可能性があります]。 –