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爬虫之爬虫的定义及URL构成
Nov 04 Python
python实现按行切分文本文件的方法
Apr 18 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
django 控制页面跳转的例子
Aug 06 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 Python
python 实现有道翻译功能
Feb 26 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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
实用函数4
2007/11/08 PHP
zend framework多模块多布局配置
2011/02/26 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php实现删除空目录的方法
2015/03/16 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
Javascript调试工具(下载)
2007/01/09 Javascript
javascript高亮效果的二种实现方法
2008/09/14 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
jquery禁用右键示例
2014/04/28 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
小型女装店的创业计划书
2014/01/09 职场文书
电子商务求职信
2014/06/15 职场文书
爬山的活动方案
2014/08/16 职场文书
树转促学习心得体会
2014/09/10 职场文书