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学习教程之Numpy和Pandas的使用
Sep 11 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
使用pandas的box_plot去除异常值
Dec 10 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 Python
Django解决frame拒绝问题的方法
Dec 18 Python
pandas统计重复值次数的方法实现
Feb 20 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 Python
如何用python反转图片,视频
Apr 24 Python
总结三种用 Python 作为小程序后端的方式
May 02 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 session处理的定制
2009/03/16 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
php的常量和变量实例详解
2017/06/27 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
Js四则运算函数代码
2012/07/21 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
python并发编程之线程实例解析
2017/12/27 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python turtle库的画笔控制说明
2020/06/28 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
Myholidays美国:在线旅游网站
2019/08/16 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
男方父母证婚词
2014/01/12 职场文书
企业精神口号
2014/06/11 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
深入理解go缓存库freecache的使用
2022/02/15 Golang
优化Mysql查询的示例
2022/04/26 MySQL