详解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的Flask框架中实现简单的登录功能的教程
Apr 20 Python
Python中random模块生成随机数详解
Mar 10 Python
详解Python迭代和迭代器
Mar 28 Python
Python实现的多线程http压力测试代码
Feb 08 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
Python读取指定日期邮件的实例
Feb 01 Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 Python
python3发送request请求及查看返回结果实例
Apr 30 Python
Python pandas如何向excel添加数据
May 22 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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/10/09 PHP
用PHP实现维护文件代码
2007/06/14 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP创建XML接口示例
2019/07/04 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
python基础教程项目三之万能的XML
2018/04/02 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
浅谈python之新式类
2018/08/12 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
自我评价怎么写正确呢?
2013/12/02 职场文书
表彰先进的通报
2014/01/31 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
运动会加油稿
2015/07/22 职场文书
学生会任命书范本
2015/09/21 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL