13

I'm trying to subscribe to keyspace event in redis using python. I hope to NOT use the for-loop with .listen() after calling .psubscribe(). Is this possible?

I have enabled all keyspace events with KEA.

def subscribe(self, key, handler):

        # this function never gets called, if I don't add the for-loop with listen() below
        def event_handler(msg):
            print('Handler', msg)

        redis_server = StrictRedis(host='localhost', port=6379, db=0)
        pubsub = redis_server.pubsub()
        subscribe_key = '*'
        pubsub.psubscribe(**{subscribe_key: event_handler})

        # without the following for-loop with listen, the callback never fires. I hope to get rid of this.
        for item in pubsub.listen():
            pass
Keven Wang
  • 1,208
  • 17
  • 28

1 Answers1

10

Using redis module threads

A good alternative would be using redis.client.PubSub.run_in_thread method.


def subscribe(self, key, handler):
    def event_handler(msg):
        print('Handler', msg)

    redis_server = StrictRedis(host='localhost', port=6379, db=0)
    pubsub = redis_server.pubsub()
    subscribe_key = '*'
    pubsub.psubscribe(**{subscribe_key: event_handler})

    pubsub.run_in_thread(sleep_time=.01)

There is a good step-by-step explanation here.

Using asyncio (aioredis)

This code can be updated for an asyncio version, using aioredis Pub/Sub support. Here is the doc and an example.

Andre Pastore
  • 2,841
  • 4
  • 33
  • 44