python实现事件驱动


Posted in Python onNovember 21, 2018

本文实例为大家分享了python实现事件驱动的具体代码,供大家参考,具体内容如下

EventManager事件管理类实现,大概就百来行代码左右。

# encoding: UTF-8
# 系统模块
from Queue import Queue, Empty
from threading import *
#################################################
class EventManager:
 #----------------------------------------------------------------------
 def __init__(self):
  """初始化事件管理器"""
  # 事件对象列表
  self.__eventQueue = Queue()
  # 事件管理器开关
  self.__active = False
  # 事件处理线程
  self.__thread = Thread(target = self.__Run)
 
  # 这里的__handlers是一个字典,用来保存对应的事件的响应函数
  # 其中每个键对应的值是一个列表,列表中保存了对该事件监听的响应函数,一对多
  self.__handlers = {}
 
 #----------------------------------------------------------------------
 def __Run(self):
  """引擎运行"""
  while self.__active == True:
   try:
    # 获取事件的阻塞时间设为1秒
    event = self.__eventQueue.get(block = True, timeout = 1) 
    self.__EventProcess(event)
   except Empty:
    pass
 
 #----------------------------------------------------------------------
 def __EventProcess(self, event):
  """处理事件"""
  # 检查是否存在对该事件进行监听的处理函数
  if event.type_ in self.__handlers:
   # 若存在,则按顺序将事件传递给处理函数执行
   for handler in self.__handlers[event.type_]:
    handler(event)
 
 #----------------------------------------------------------------------
 def Start(self):
  """启动"""
  # 将事件管理器设为启动
  self.__active = True
  # 启动事件处理线程
  self.__thread.start()
 
 #----------------------------------------------------------------------
 def Stop(self):
  """停止"""
  # 将事件管理器设为停止
  self.__active = False
  # 等待事件处理线程退出
  self.__thread.join()
 
 #----------------------------------------------------------------------
 def AddEventListener(self, type_, handler):
  """绑定事件和监听器处理函数"""
  # 尝试获取该事件类型对应的处理函数列表,若无则创建
  try:
   handlerList = self.__handlers[type_]
  except KeyError:
   handlerList = []
 
  self.__handlers[type_] = handlerList
  # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
  if handler not in handlerList:
   handlerList.append(handler)
 
 #----------------------------------------------------------------------
 def RemoveEventListener(self, type_, handler):
  """移除监听器的处理函数"""
  #读者自己试着实现
 
 #----------------------------------------------------------------------
 def SendEvent(self, event):
  """发送事件,向事件队列中存入事件"""
  self.__eventQueue.put(event)
 
########################################################################
"""事件对象"""
class Event:
 def __init__(self, type_=None):
  self.type_ = type_  # 事件类型
  self.dict = {}   # 字典用于保存具体的事件数据

测试代码

#-------------------------------------------------------------------
# encoding: UTF-8
import sys
from datetime import datetime
from threading import *
from EventManager import *
 
#事件名称 新文章
EVENT_ARTICAL = "Event_Artical"
 
#事件源 公众号
class PublicAccounts:
 def __init__(self,eventManager):
  self.__eventManager = eventManager
 def WriteNewArtical(self):
  #事件对象,写了新文章
  event = Event(type_=EVENT_ARTICAL)
  event.dict["artical"] = u'如何写出更优雅的代码\n'
  #发送事件
  self.__eventManager.SendEvent(event)
  print u'公众号发送新文章\n'
 
#监听器 订阅者
class Listener:
 def __init__(self,username):
  self.__username = username
 
 #监听器的处理函数 读文章
 def ReadArtical(self,event):
  print(u'%s 收到新文章' % self.__username)
  print(u'正在阅读新文章内容:%s' % event.dict["artical"])
 
"""测试函数"""
#--------------------------------------------------------------------
def test():
 listner1 = Listener("thinkroom") #订阅者1
 listner2 = Listener("steve")#订阅者2
 
 eventManager = EventManager()
 
 #绑定事件和监听器响应函数(新文章)
 eventManager.AddEventListener(EVENT_ARTICAL, listner1.ReadArtical)
 eventManager.AddEventListener(EVENT_ARTICAL, listner2.ReadArtical)
 eventManager.Start()
 
 publicAcc = PublicAccounts(eventManager)
 timer = Timer(2, publicAcc.WriteNewArtical)
 timer.start()
 
if __name__ == '__main__':
 test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python统计日志中每个IP出现次数的方法
Jul 06 Python
浅析Python的web.py框架中url的设定方法
Jul 11 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
Python 通过URL打开图片实例详解
Jun 01 Python
Python绘制KS曲线的实现方法
Aug 13 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
PyTorch预训练的实现
Sep 18 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
Python实现生成bmp图像的方法
Jun 13 Python
python事件驱动event实现详解
Nov 21 #Python
python程序封装为win32服务的方法
Mar 07 #Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 #Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 #Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 #Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 #Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 #Python
You might like
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
Python中的进程分支fork和exec详解
2015/04/11 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python破解zip加密文件的方法
2018/05/31 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
Python如何生成xml文件
2020/06/04 Python
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis