详解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/ironpython:从入门到精通
Oct 02 Python
用Python编写生成树状结构的文件目录的脚本的教程
May 04 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Tensorflow 查看变量的值方法
Jun 14 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Python 3.8 新功能全解
Jul 25 Python
Python操作qml对象过程详解
Sep 26 Python
Python基础之高级变量类型实例详解
Jan 03 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
基于python实现可视化生成二维码工具
Jul 08 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下常用正则表达式整理
2010/10/26 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
常用DOM整理
2015/06/16 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
package.json文件配置详解
2017/06/15 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
django上传图片并生成缩略图方法示例
2017/12/11 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
详解Python IO口多路复用
2020/06/17 Python
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
大学生村官演讲稿
2014/04/25 职场文书
我的理想演讲稿
2014/04/30 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
运动会100米加油稿
2015/07/21 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫