详解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简单实现计算过期时间的方法
Jun 09 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python中单、双下划线的区别总结
Dec 01 Python
深入浅析python with语句简介
Apr 11 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
python 图像平移和旋转的实例
Jan 10 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
Python 如何安装Selenium
May 06 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类
2006/11/25 PHP
实用函数9
2007/11/08 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
python使用RNN实现文本分类
2018/05/24 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
python从Oracle读取数据生成图表
2020/10/14 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
学用政策心得体会
2014/09/10 职场文书
招标授权委托书样本
2014/09/23 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
五一晚会主持词
2015/07/01 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书