python模拟事件触发机制详解


Posted in Python onJanuary 19, 2018

本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下

EventManager.py

# -*- 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 = {}     # 字典用于保存具体的事件数据

test.py

# -*- encoding: UTF-8 -*-

from threading import *
from EventManager import *
import time

#事件名称 新文章
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'公众号发送新文章')


#监听器 订阅者
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)
  while True:
    publicAcc.WriteNewArtical()
    time.sleep(2)

if __name__ == '__main__':
  test()

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

Python 相关文章推荐
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Django实现学员管理系统
Feb 26 Python
python实现BP神经网络回归预测模型
Aug 09 Python
WxPython实现无边框界面
Nov 18 Python
Django之腾讯云短信的实现
Jun 12 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
pytorch中的numel函数用法说明
May 13 Python
Python办公自动化之Excel(中)
May 24 Python
Python实现信息管理系统
Jun 05 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 #Python
简单谈谈python中的lambda表达式
Jan 19 #Python
python使用logging模块发送邮件代码示例
Jan 18 #Python
zookeeper python接口实例详解
Jan 18 #Python
Python获取当前函数名称方法实例分享
Jan 18 #Python
Python AES加密实例解析
Jan 18 #Python
快速了解python leveldb
Jan 18 #Python
You might like
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
python实现简单socket通信的方法
2016/04/19 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
python怎么自定义捕获错误
2020/06/29 Python
python实现计算器简易版
2020/12/17 Python
python实现代码审查自动回复消息
2021/02/01 Python
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
两年的个人工作自我评价
2014/01/10 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
小学生读书笔记范文
2015/06/30 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
学校体育节班级口号
2015/12/25 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
python异常中else的实例用法
2021/06/15 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python