详解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 正则表达式 概述及常用字符
May 04 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
python代码过长的换行方法
Jul 19 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
浅谈python处理json和redis hash的坑
Jul 16 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
基于Python的EasyGUI学习实践
May 07 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获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
php精度计算的问题解析
2019/06/21 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
荷兰手表网站:Watch2Day
2018/07/02 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
大学生毕业自我鉴定
2013/11/06 职场文书
商务考察邀请函范文
2014/01/21 职场文书
小学体育教学反思
2014/01/31 职场文书
关于安全的演讲稿
2014/05/09 职场文书
师德师风剖析材料
2014/09/30 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
redis三种高可用方式部署的实现
2021/05/11 Redis
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
Redis 异步机制
2022/05/15 Redis