详解Python实现多进程异步事件驱动引擎


Posted in Python onAugust 25, 2017

本文介绍了详解Python实现多进程异步事件驱动引擎,分享给大家,具体如下:

多进程异步事件驱动逻辑

详解Python实现多进程异步事件驱动引擎

逻辑

code

# -*- coding: utf-8 -*-

'''
author:    Jimmy
contact:   234390130@qq.com
file:     eventEngine.py
time:     2017/8/25 上午10:06
description: 多进程异步事件驱动引擎

'''

__author__ = 'Jimmy'


from multiprocessing import Process, Queue


class EventEngine(object):
  # 初始化事件事件驱动引擎
  def __init__(self):
    #保存事件列表
    self.__eventQueue = Queue()
    #引擎开关
    self.__active = False
    #事件处理字典{'event1': [handler1,handler2] , 'event2':[handler3, ...,handler4]}
    self.__handlers = {}
    #保存事件处理进程池
    self.__processPool = []
    #事件引擎主进程
    self.__mainProcess = Process(target=self.__run)


  #执行事件循环
  def __run(self):
    while self.__active:
      #事件队列非空
      if not self.__eventQueue.empty():
        #获取队列中的事件 超时1秒
        event = self.__eventQueue.get(block=True ,timeout=1)
        #执行事件
        self.__process(event)
      else:
        # print('无任何事件')
        pass


  #执行事件
  def __process(self, event):
    if event.type in self.__handlers:
      for handler in self.__handlers[event.type]:
        #开一个进程去异步处理
        p = Process(target=handler, args=(event, ))
        #保存到进程池
        self.__processPool.append(p)
        p.start()


  #开启事件引擎
  def start(self):
    self.__active = True
    self.__mainProcess.start()


  #暂停事件引擎
  def stop(self):
    """停止"""
    # 将事件管理器设为停止
    self.__active = False
    # 等待事件处理进程退出
    for p in self.__processPool:
      p.join()
    self.__mainProcess.join()


  #终止事件引擎
  def terminate(self):
    self.__active = False
    #终止所有事件处理进程
    for p in self.__processPool:
      p.terminate()
    self.__mainProcess.join()


  #注册事件
  def register(self, type, handler):
    """注册事件处理函数监听"""
    # 尝试获取该事件类型对应的处理函数列表,若无则创建
    try:
      handlerList = self.__handlers[type]
    except KeyError:
      handlerList = []
      self.__handlers[type] = handlerList

    # 若要注册的处理器不在该事件的处理器列表中,则注册该事件
    if handler not in handlerList:
      handlerList.append(handler)


  def unregister(self, type, handler):
    """注销事件处理函数监听"""
    # 尝试获取该事件类型对应的处理函数列表,若无则忽略该次注销请求
    try:
      handlerList = self.__handlers[type]

      # 如果该函数存在于列表中,则移除
      if handler in handlerList:
        handlerList.remove(handler)

      # 如果函数列表为空,则从引擎中移除该事件类型
      if not handlerList:
        del self.__handlers[type]
    except KeyError:
      pass


  def sendEvent(self, event):
    #发送事件 像队列里存入事件
    self.__eventQueue.put(event)


class Event(object):
  #事件对象
  def __init__(self, type =None):
    self.type = type
    self.dict = {}



#测试
if __name__ == '__main__':
  import time
  EVENT_ARTICAL = "Event_Artical"

  # 事件源 公众号
  class PublicAccounts:
    def __init__(self, eventManager):
      self.__eventManager = eventManager

    def writeNewArtical(self):
      # 事件对象,写了新文章
      event = Event(EVENT_ARTICAL)
      event.dict["artical"] = u'如何写出更优雅的代码\n'
      # 发送事件
      self.__eventManager.sendEvent(event)
      print(u'公众号发送新文章\n')


  # 监听器 订阅者
  class ListenerTypeOne:
    def __init__(self, username):
      self.__username = username

    # 监听器的处理函数 读文章
    def ReadArtical(self, event):
      print(u'%s 收到新文章' % self.__username)
      print(u'%s 正在阅读新文章内容:%s' % (self.__username, event.dict["artical"]))


  class ListenerTypeTwo:
    def __init__(self, username):
      self.__username = username

    # 监听器的处理函数 读文章
    def ReadArtical(self, event):
      print(u'%s 收到新文章 睡3秒再看' % self.__username)
      time.sleep(3)
      print(u'%s 正在阅读新文章内容:%s' % (self.__username, event.dict["artical"]))


  def test():
    listner1 = ListenerTypeOne("thinkroom") # 订阅者1
    listner2 = ListenerTypeTwo("steve") # 订阅者2

    ee = EventEngine()

    # 绑定事件和监听器响应函数(新文章)
    ee.register(EVENT_ARTICAL, listner1.ReadArtical)
    ee.register(EVENT_ARTICAL, listner2.ReadArtical)
    for i in range(0, 20):
      listner3 = ListenerTypeOne("Jimmy") # 订阅者X
      ee.register(EVENT_ARTICAL, listner3.ReadArtical)

    ee.start()

    #发送事件
    publicAcc = PublicAccounts(ee)
    publicAcc.writeNewArtical()

  test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
实例讲解Python中的私有属性
Aug 21 Python
Python中的index()方法使用教程
May 18 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
PyQt实现界面翻转切换效果
Apr 20 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
numpy中的ndarray方法和属性详解
May 27 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
python基础while循环及if判断的实例讲解
Aug 25 #Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 #Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 #Python
详解python基础之while循环及if判断
Aug 24 #Python
用Python实现随机森林算法的示例
Aug 24 #Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 #Python
python 接口_从协议到抽象基类详解
Aug 24 #Python
You might like
PHP中for循环语句的几种变型
2006/11/26 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
Javascript刷新窗口方法小结
2015/10/21 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
园林毕业生自我鉴定范文
2013/12/29 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
施工质量承诺书范文
2014/05/30 职场文书
高中学生自我评价范文
2014/09/23 职场文书
作息时间调整通知
2015/04/22 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书