#/usr/env/bin python

'''
this is document
'''
class Event(object):
'''
事件初始化的一个方式
'''
def __init__(self,event_type,data=None):
self._type = event_type
self._data = data @property
def type(self):
return self._type @property
def data(self):
return self._data class EventDispatcher(object):
"""
event分发类 监听和分发event事件
"""
def __init__(self):
#初始化事件
self._events = dict() def __del__(self):
self._events = None def has_listener(self,event_type,listener):
if event_type in self._events.keys():
return listener in self._events[event_type]
else:
return False def dispatch_event(self,event):
"""
Dispatch an instance of Event class
"""
# 分发event到所有关联的listener
if event.type in self._events.keys():
listeners = self._events[event.type] for listener in listeners:
listener(event) def add_event_listener(self,event_type,listener):
#给某种事件类型添加listner
if not self.has_listener(event_type,listener):
listeners = self._events.get(event_type,[])
listeners.append(listener)
self._events[event_type] = listeners def remove_event_listener(self,event_type,listener):
if self.has_listener(event_type,listener):
listeners = self._events[event_type]
if len(listeners) == 1:
del self._events[event_type]
else:
listeners.remove(listener)
self._events[event_type] = listeners class MyEvent(Event):
ASK = "askMyEvent"
RESPOND = "respondMyEvent" class WhoAsk(object):
def __init__(self,event_dispatcher):
self.event_dispatcher = event_dispatcher
self.event_dispatcher.add_event_listener(
MyEvent.RESPOND,self.on_answer_event
)
def ask(self):
print("who are listener to me?")
self.event_dispatcher.dispatch_event(MyEvent(MyEvent.ASK,self)) def on_answer_event(self,event):
print("receive event %s",event.data) class WhoRespond(object):
def __init__(self,event_dispatcher):
self.event_dispatcher = event_dispatcher
self.event_dispatcher.add_event_listener(MyEvent.ASK,self.on_ask_event) def on_ask_event(self,event):
self.event_dispatcher.dispatch_event(MyEvent(MyEvent.RESPOND,self)) dispatcher = EventDispatcher()
who_ask = WhoAsk( dispatcher )
who_responde1 = WhoRespond( dispatcher )
who_responde2 = WhoRespond( dispatcher ) # WhoAsk ask
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. java读取大容量excel之二(空格、空值问题)

    最近在项目中发现,对于Excel2007(底层根本是xml) ,使用<java读取大容量excel之一>中的方式读取,若待读取的excel2007文件中某一列是空值,(注意,所谓的空值是什 ...

  2. matlab 解方程组

    1.解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法:(1)x=in ...

  3. bistu新生-1004

    #include "stdio.h"#include "stdlib.h"#include "math.h"int cmp(const vo ...

  4. oracle的存储结构

    表空间 当一个用户被创建以后,随之就要为用户分配数据存储的空间,这在oracle中成为“表空间”(Tablespace). 在数据库中创建用户时,基于应用性能和管理的考虑,最好为不同的用户创建独立的表 ...

  5. Boostrap栅格系统

    Boostrap排版.链接样式设置了基本的全局样式.分别是:为body元素设置 布局容器:Bootstrap需要为页面内容和栅格系统包裹一个:container容器.Bootstrap提供了两个作此用 ...

  6. HDU 4888 (网络流)

    Poroblem Redraw Beautiful Drawings (HDU4888) 题目大意 一个n行m列的矩形,只能填0~k的数字. 给定各行各列的数字和,判定有无合法的方案数.一解给出方案, ...

  7. BZOJ3261 最大异或和 (可持久化Trie)

    ; len=; var x,y,z,n,m,tot,lx,i:longint; sum:..maxn] of longint; rt:..maxn] of longint; time,l,r:..ma ...

  8. Unity3D ShaderLab 简单的立方体图反射

    Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将 ...

  9. 微信公众号 SDK

    <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...

  10. 第二个Sprint冲刺第九天

    讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:接着昨天的任务