Принятый ответ устарел, так как 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, когда вы хотите знать, пришло ли сообщение.