publish_subscribe.py 1.5 KB

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