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字符串对象的实现
Dec 24 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python可视化爬虫界面之天气查询
Jul 03 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
python3字符串输出常见面试题总结
Dec 01 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 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
10个实用的PHP代码片段
2011/09/02 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
动态加载jquery库的方法
2014/02/12 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
详解Python文本操作相关模块
2017/06/22 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
司机岗位职责
2013/11/15 职场文书
管理提升方案
2014/06/04 职场文书
幼儿老师求职信
2014/06/30 职场文书
我的中国心演讲稿
2014/09/04 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
会计专业自荐信范文
2015/03/05 职场文书
听证通知书
2015/04/24 职场文书
高中英语教学反思范文
2016/03/02 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android