接受的答案已过时,因为 redis-py 建议您使用 non-blocking get_message()
。但它也提供了一种轻松使用线程的方法。
https://pypi.python.org/pypi/redis
阅读消息有三种不同的策略。
在幕后,get_message() 使用系统的“选择”模块快速轮询连接的套接字。如果有数据可供读取,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。