详解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获取mp3文件信息的方法
Jun 15 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Python实现购物车购物小程序
Apr 18 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
python实现文件的备份流程详解
Jun 18 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 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
德劲1107的电路分析与打磨
2021/03/02 无线电
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
用js实现trim()的解决办法
2013/04/16 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
饭店工作计划书
2014/01/10 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
网站创业计划书
2014/04/30 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
营业用房租赁协议书
2014/11/26 职场文书
教师个人考察材料
2014/12/16 职场文书
千与千寻观后感
2015/06/04 职场文书
花木兰观后感
2015/06/10 职场文书
运动会通讯稿50字
2015/07/20 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书