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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
python黑魔法之编码转换
Jan 25 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
什么是python的列表推导式
May 26 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 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
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
jtable列中自定义button示例代码
2013/11/21 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python list转dict示例分享
2014/01/28 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
python分布式编程实现过程解析
2019/11/08 Python
大学生自我评价怎样写好
2013/10/23 职场文书
店面销售职位的职责
2014/03/09 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
2016年元旦寄语
2015/08/17 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
详解Python生成器和基于生成器的协程
2021/06/03 Python
Java设计模式之代理模式
2022/04/22 Java/Android