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获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
快速入手Python字符编码
Aug 03 Python
将python代码和注释分离的方法
Apr 21 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
python中for循环变量作用域及用法详解
Nov 05 Python
详解KMP算法以及python如何实现
Sep 18 Python
Python内置函数及功能简介汇总
Oct 13 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 Python
Python语言中的数据类型-序列
Feb 24 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
拼音码表的生成
2006/10/09 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
python获取本机外网ip的方法
2015/04/15 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python:socket传输大文件示例
2017/01/18 Python
基于Python os模块常用命令介绍
2017/11/03 Python
tensorflow获取变量维度信息
2018/03/10 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
干部培训自我鉴定
2014/01/22 职场文书
摄影助理岗位职责
2014/02/07 职场文书
前台接待岗位职责
2015/02/03 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python