publish_subscribe.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Reference: http://www.slideshare.net/ishraqabd/publish-subscribe-model-overview-13368808
  5. Author: https://github.com/HanWenfang
  6. """
  7. class Provider:
  8. def __init__(self):
  9. self.msg_queue = []
  10. self.subscribers = {}
  11. def notify(self, msg):
  12. self.msg_queue.append(msg)
  13. def subscribe(self, msg, subscriber):
  14. if msg not in self.subscribers:
  15. self.subscribers[msg] = []
  16. self.subscribers[msg].append(subscriber) # unfair
  17. else:
  18. self.subscribers[msg].append(subscriber)
  19. def unsubscribe(self, msg, subscriber):
  20. self.subscribers[msg].remove(subscriber)
  21. def update(self):
  22. for msg in self.msg_queue:
  23. if msg in self.subscribers:
  24. for sub in self.subscribers[msg]:
  25. sub.run(msg)
  26. self.msg_queue = []
  27. class Publisher:
  28. def __init__(self, msg_center):
  29. self.provider = msg_center
  30. def publish(self, msg):
  31. self.provider.notify(msg)
  32. class Subscriber:
  33. def __init__(self, name, msg_center):
  34. self.name = name
  35. self.provider = msg_center
  36. def subscribe(self, msg):
  37. self.provider.subscribe(msg, self)
  38. def run(self, msg):
  39. print("{} got {}".format(self.name, msg))
  40. def main():
  41. message_center = Provider()
  42. fftv = Publisher(message_center)
  43. jim = Subscriber("jim", message_center)
  44. jim.subscribe("cartoon")
  45. jack = Subscriber("jack", message_center)
  46. jack.subscribe("music")
  47. gee = Subscriber("gee", message_center)
  48. gee.subscribe("movie")
  49. fftv.publish("cartoon")
  50. fftv.publish("music")
  51. fftv.publish("ads")
  52. fftv.publish("movie")
  53. fftv.publish("cartoon")
  54. fftv.publish("cartoon")
  55. fftv.publish("movie")
  56. fftv.publish("blank")
  57. message_center.update()
  58. if __name__ == "__main__":
  59. main()
  60. ### OUTPUT ###
  61. # jim got cartoon
  62. # jack got music
  63. # gee got movie
  64. # jim got cartoon
  65. # jim got cartoon
  66. # gee got movie