publish_subscribe.py 1.8 KB

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