详解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 获取进程pid号的方法
Mar 10 Python
python模块之re正则表达式详解
Feb 03 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
python基于http下载视频或音频
Jun 20 Python
python和opencv实现抠图
Jul 18 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
树莓派实现移动拍照
Jun 22 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
Python 使用type来定义类的实现
Nov 19 Python
python打印异常信息的两种实现方式
Dec 24 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实现无限级分类实现代码(递归方法)
2011/01/01 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
vue实现文字加密功能
2019/09/27 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python实现媒体播放器功能
2018/02/11 Python
使用Python更换外网IP的方法
2018/07/09 Python
如何在 Django 模板中输出 "{{"
2020/01/24 Python
django使用graphql的实例
2020/09/02 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
JD Sports意大利:英国篮球和运动时尚的领导者
2017/10/29 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
大学生毕业自我评价范文分享
2013/11/07 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
员工开除通知书
2015/04/25 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python