接受的答案已过时,因为redis-py建议您使用非阻塞的get_message()
。但它也提供了一种轻松使用线程的方法。
https://pypi.python.org/pypi/redis
有阅读邮件三种不同的策略。
在幕后,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
第三个选项在单独的线程中运行事件循环。 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 –
使用pubsub对象的.get_message()方法代替.listen()(下面有一个示例)。 [发布此问题时,Python Redis驱动程序可能不支持此方法]。 –