1. #/usr/env/bin python
  2.  
  3. '''
  4. this is document
  5. '''
  6. class Event(object):
  7. '''
  8. 事件初始化的一个方式
  9. '''
  10. def __init__(self,event_type,data=None):
  11. self._type = event_type
  12. self._data = data
  13.  
  14. @property
  15. def type(self):
  16. return self._type
  17.  
  18. @property
  19. def data(self):
  20. return self._data
  21.  
  22. class EventDispatcher(object):
  23. """
  24. event分发类 监听和分发event事件
  25. """
  26. def __init__(self):
  27. #初始化事件
  28. self._events = dict()
  29.  
  30. def __del__(self):
  31. self._events = None
  32.  
  33. def has_listener(self,event_type,listener):
  34. if event_type in self._events.keys():
  35. return listener in self._events[event_type]
  36. else:
  37. return False
  38.  
  39. def dispatch_event(self,event):
  40. """
  41. Dispatch an instance of Event class
  42. """
  43. # 分发event到所有关联的listener
  44. if event.type in self._events.keys():
  45. listeners = self._events[event.type]
  46.  
  47. for listener in listeners:
  48. listener(event)
  49.  
  50. def add_event_listener(self,event_type,listener):
  51. #给某种事件类型添加listner
  52. if not self.has_listener(event_type,listener):
  53. listeners = self._events.get(event_type,[])
  54. listeners.append(listener)
  55. self._events[event_type] = listeners
  56.  
  57. def remove_event_listener(self,event_type,listener):
  58. if self.has_listener(event_type,listener):
  59. listeners = self._events[event_type]
  60. if len(listeners) == 1:
  61. del self._events[event_type]
  62. else:
  63. listeners.remove(listener)
  64. self._events[event_type] = listeners
  65.  
  66. class MyEvent(Event):
  67. ASK = "askMyEvent"
  68. RESPOND = "respondMyEvent"
  69.  
  70. class WhoAsk(object):
  71. def __init__(self,event_dispatcher):
  72. self.event_dispatcher = event_dispatcher
  73. self.event_dispatcher.add_event_listener(
  74. MyEvent.RESPOND,self.on_answer_event
  75. )
  76. def ask(self):
  77. print("who are listener to me?")
  78. self.event_dispatcher.dispatch_event(MyEvent(MyEvent.ASK,self))
  79.  
  80. def on_answer_event(self,event):
  81. print("receive event %s",event.data)
  82.  
  83. class WhoRespond(object):
  84. def __init__(self,event_dispatcher):
  85. self.event_dispatcher = event_dispatcher
  86. self.event_dispatcher.add_event_listener(MyEvent.ASK,self.on_ask_event)
  87.  
  88. def on_ask_event(self,event):
  89. self.event_dispatcher.dispatch_event(MyEvent(MyEvent.RESPOND,self))
  90.  
  91. dispatcher = EventDispatcher()
  92. who_ask = WhoAsk( dispatcher )
  93. who_responde1 = WhoRespond( dispatcher )
  94. who_responde2 = WhoRespond( dispatcher )
  95.  
  96. # WhoAsk ask
  97. who_ask.ask()

转自:http://my.oschina.net/u/1462124/blog/477693

Python-事件驱动模型代码的更多相关文章

  1. Python自动化之select、greenlet和gevent和事件驱动模型初探

    进程.线程和协程的区别 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 协程和线程一样 ...

  2. Python并发编程-事件驱动模型

     一.事件驱动模型介绍                                                                                         ...

  3. 从spring框架中的事件驱动模型出发,优化实际应用开发代码

    一.事件起源 相信很多人在使用spring框架进行开发时,都会遇到这样的需求:在spring启动后,立即加载部分资源(例如:spring启动后立刻加载资源初始化到redis中).当我去解决这个问题时发 ...

  4. python网络编程--事件驱动模型

    论事件驱动与异步IO 事件驱动模型:根据事件的触发去干什么事,就是根据一个事件做反应 原文:http://www.cnblogs.com/alex3714/articles/5248247.html常 ...

  5. Day14 - Python基础14 事件驱动模型、IO模型

    本节内容: 1:事件驱动模型 2:IO模型前戏准备 3:4种IO模型 1:事件驱动模型 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C---> ...

  6. 35.python之事件驱动模型

    转载:https://www.cnblogs.com/yuanchenqi/articles/5722574.html 事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么 ...

  7. python学习之-- 事件驱动模型

    目前主流的网络驱动模型:事件驱动模型 事件驱动模型:也属于生产者/消费者结构,通过一个队列,保存生产者触发的事件,队列另一头是一个循环从队列里不断的提取事件.大致流程如下:1:首先生成一个事件消息队列 ...

  8. python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题

    笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...

  9. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  10. 详解Spring事件驱动模型

    转载自:http://jinnianshilongnian.iteye.com/blog/1902886#comments 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理 ...

随机推荐

  1. hadoop2.x通过Zookeeper来实现namenode的HA方案以及ResourceManager单点故障的解决方案

    我们知道hadoop1.x之前的namenode存在两个主要的问题:1.namenode内存瓶颈的问题,2.namenode的单点故障的问题.针对这两个问题,hadoop2.x都对它进行改进和解决.其 ...

  2. asp中cookie欺骗/注入原理与防范

     一直以来sql注入被广泛关注,也有专门的防注系统代码.发现,如果代码不严谨也会有cookie欺骗/注入的情况.原来, 防注入系统没有注意到 Cookies 的问题!这里以ASP为例,分析一下cook ...

  3. 从对SAE的一次授权安全评估浅谈云安全

      EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-12-20From: http://www.80sec.com/ [ 目录 ...

  4. Mousejack测试指南

    0x00 前言 近日,Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制电脑操作,他们将此攻击命名为MouseJack. 攻击者仅需要在亚马逊上以60美元购买设备,改造 ...

  5. Moto G如何进入开发者选项

    最近买了个Moto G做应用开发,突然发现开发者选项居然没有,搜索了一下发现是Google隐藏了此选项. http://allaboutmotog.com/moto-g-how-to-guide/ac ...

  6. Spring处理器

    Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext抽象实现类,该抽象类的refresh()方法定义了Spring容器 ...

  7. NSArray,NSSet,NSDictionary的遍历,基本使用集锦

    NSArray *array = [NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu&quo ...

  8. jquery模拟淘宝购物车

    今天要实现的一个功能页面就是利用jquery代码模拟一个淘宝网的购物车结算页面 总体页面效果如图: 首先我们要实现的内容的需求有如下几点: 1.在购物车页面中,当选中“全选”复选框时,所有商品前的复选 ...

  9. XML HttpRequest

    XMLHttpRequest对象提供了在网页加载后与服务器进行通信的方法. 使用XMLHttpRequest对象,能够: 在不重新加载页面的情况下更新网页 在页面已加载后从服务器请求数据,接受数据 在 ...

  10. 如何给magento的产品页面添加返回按钮

    如何给magento的产品页面添加返回按钮,最模板提供教程 第一步: 打开 E:\xampp\htdocs\magento\skin\frontend\default\bluescale\css\st ...