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爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
详解Python中的strftime()方法的使用
May 22 Python
Python实现将绝对URL替换成相对URL的方法
Jun 28 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
python正则实现提取电话功能
Feb 24 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
Jan 08 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
Python二元算术运算常用方法解析
Sep 15 Python
Python pickle模块常用方法代码实例
Oct 10 Python
在终端启动Python时报错的解决方案
Nov 20 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
极典R601SW收音机
2021/03/02 无线电
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
python实现聚类算法原理
2018/02/12 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
迪奥官网:Dior.com
2018/12/04 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
退休感言
2014/01/28 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
挂靠协议书
2015/01/27 职场文书
高二语文教学反思
2016/02/16 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android