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程序
Apr 04 Python
python 正则式使用心得
May 07 Python
Python生成验证码实例
Aug 21 Python
python安装教程 Pycharm安装详细教程
May 02 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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防止sql注入代码实例
2013/12/18 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
js实现内置计时器
2019/12/16 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
抽象类和接口的区别
2012/09/19 面试题
上班打牌检讨书
2014/02/07 职场文书
聘用意向书范本
2014/04/01 职场文书
单位授权委托书范文
2014/08/02 职场文书
学校联谊协议书
2014/09/16 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
开会通知短信大全
2015/04/20 职场文书
董事会决议范本
2015/07/01 职场文书
详解Go语言中Get/Post请求测试
2022/06/01 Golang