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 httplib模块使用实例
Apr 11 Python
Python中用于计算对数的log()方法
May 15 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
python批量爬取下载抖音视频
Jun 17 Python
python issubclass 和 isinstance函数
Jul 25 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
python调用支付宝支付接口流程
Aug 15 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
OpenCV全景图像拼接的实现示例
Jun 05 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
js实现碰撞检测
2021/01/29 Javascript
python中的函数用法入门教程
2014/09/02 Python
利用python画一颗心的方法示例
2017/01/31 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
python 标准差计算的实现(std)
2019/07/29 Python
python安装scipy的步骤解析
2019/09/28 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
Python开发五子棋小游戏
2022/04/28 Python