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之用while来循环
Oct 02 Python
Python批量创建迅雷任务及创建多个文件
Feb 13 Python
Python正则表达式经典入门教程
May 22 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python实现Selenium自动化Page模式
Jul 14 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python中return函数返回值实例用法
Nov 19 Python
python识别围棋定位棋盘位置
Jul 26 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
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
Prototype Date对象 学习
2009/07/12 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
Fiddler如何抓取手机APP数据包
2016/01/22 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
Python读取yaml文件的详细教程
2020/07/21 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
春节联欢晚会主持词
2014/03/24 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
导游带团欢迎词
2015/09/30 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
python实现学生信息管理系统(面向对象)
2022/06/05 Python