publish_subscribe.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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.subscribe_queue = {}
  10. self.msg_queue=[]
  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. if !self.subscribe[msg]:
  22. del self.subscribe[msg]
  23. def update(self):
  24. for msg in self.msg_queue:
  25. if msg in self.subscribers.keys():
  26. for suber in self.subscribers[msg]:
  27. suber.get(msg)
  28. self.msg_queue = []
  29. class Publisher:
  30. def __init__(self, msg_center):
  31. self.provider = msg_center
  32. def publish(self, msg):
  33. self.provider.notify(msg)
  34. class Subscriber:
  35. def __init__(self, name, msg_center):
  36. self.name = name
  37. self.provider = msg_center
  38. def subscribe(self, msg):
  39. self.provider.subscribe(msg, self)
  40. def get(self, msg):
  41. print("{} got {}".format(self.name, msg))
  42. def main():
  43. message_center = Provider()
  44. fftv = Publisher(message_center)
  45. jim = Subscriber("jim", message_center)
  46. jim.subscribe("cartoon")
  47. jack = Subscriber("jack", message_center)
  48. jack.subscribe("music")
  49. gee = Subscriber("gee", message_center)
  50. gee.subscribe("movie")
  51. fftv.publish("cartoon")
  52. fftv.publish("music")
  53. fftv.publish("ads")
  54. fftv.publish("movie")
  55. fftv.publish("cartoon")
  56. fftv.publish("cartoon")
  57. fftv.publish("movie")
  58. fftv.publish("blank")
  59. message_center.update()
  60. if __name__ == "__main__":
  61. main()
  62. ### OUTPUT ###
  63. # jim got cartoon
  64. # jack got music
  65. # gee got movie
  66. # jim got cartoon
  67. # jim got cartoon
  68. # gee got movie