/examples/pubsub.py

https://github.com/NoneGG/aredis · Python · 49 lines · 36 code · 9 blank · 4 comment · 4 complexity · 006c267345d86d7ec9d35de359b26bcd MD5 · raw file

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import aredis
  4. import asyncio
  5. import concurrent.futures
  6. import time
  7. import logging
  8. async def wait_for_message(pubsub, timeout=2, ignore_subscribe_messages=False):
  9. now = time.time()
  10. timeout = now + timeout
  11. while now < timeout:
  12. message = await pubsub.get_message(
  13. ignore_subscribe_messages=ignore_subscribe_messages,
  14. timeout=1
  15. )
  16. if message is not None:
  17. print(message)
  18. await asyncio.sleep(0.01)
  19. now = time.time()
  20. return None
  21. async def subscribe(client):
  22. await client.flushdb()
  23. pubsub = client.pubsub()
  24. assert pubsub.subscribed is False
  25. await pubsub.subscribe('foo')
  26. # assert await pubsub.subscribe() is True
  27. await wait_for_message(pubsub)
  28. async def publish(client):
  29. # sleep to wait for subscriber to listen
  30. await asyncio.sleep(1)
  31. await client.publish('foo', 'test message')
  32. await client.publish('foo', 'quit')
  33. if __name__ == '__main__':
  34. logging.basicConfig(level=logging.DEBUG)
  35. client = aredis.StrictRedis()
  36. loop = asyncio.get_event_loop()
  37. loop.set_debug(enabled=True)
  38. with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
  39. executor.submit(asyncio.run_coroutine_threadsafe, publish(client), loop)
  40. loop.run_until_complete(subscribe(client))