python实现简单事件驱动引擎

     最近在看clustershell的源码,看的迷迷糊糊的,没想到一个简单的批量执行命令的工具居然实现的挺复杂,采用了事件驱动引擎实现。但是我不太懂这个,所以在网上看了几篇帖子就实现了一个超级简单的事件驱动引擎实践一下。

  1 # -*- coding:utf8 -*-
  2 
  3 import time
  4 from Queue import Queue
  5 from threading import Thread
  6 
  7 # 定义了两个事件类型
  8 EVENT_TIMER = 'ev_time'
  9 EVENT_WRITE = 'ev_write'
 10 
 11 
 12 # 本次测试追求简单没有使用这个类
 13 class Event(object):
 14 
 15     def __init__(self,  _type=None):
 16         self._type = _type
 17         self._dic = {}
 18 
 19 
 20 class EventEngine(object):
 21     def __init__(self):
 22         """
 23         事件驱动引擎实现,对象都是私有的防止外部非法访问。
 24         __queue:事件队列
 25         __handlers:事件对应的处理函数
 26         __active:引擎开关
 27         __thread:事件处理线程
 28 
 29         """
 30         self.__queue = Queue()
 31         self.__handlers = {}
 32         self.__active = False
 33         self.__thread = Thread(target=self.__run)
 34 
 35 
 36         """
 37         自己编写一个定时器
 38         __timer_active:定时器开关
 39         __timer_sleep:定时器间隔事件
 40         __timer:定时器线程
 41         """
 42         self.__timer_active = False
 43         self.__timer_sleep = 1
 44         self.__timer = Thread(target=self.__run_timer)
 45 
 46     def __process(self, ev):
 47         # 处理事件的函数
 48         if ev in self.__handlers:
 49             handler = self.__handlers[ev]
 50             handler(ev)
 51 
 52     def __run(self):
 53         # 事件处理循环
 54         while self.__active:
 55             try:
 56                 ev = self.__queue.get(block=True, timeout=1.0)
 57                 self.__process(ev)
 58             except Exception as e:
 59                 continue
 60 
 61     def start(self, timer):
 62         # 引擎启动函数
 63         self.__active = True
 64         self.__thread.start()
 65 
 66         if timer:
 67             self.__timer_active = True
 68             self.__timer.start()
 69 
 70     def __run_timer(self):
 71         # 定时器启动函数
 72         while self.__timer_active:
 73             self.__queue.put(EVENT_TIMER)
 74             time.sleep(self.__timer_sleep)
 75 
 76     def stop(self):
 77         # 引擎关闭函数
 78         self.__active = False
 79         self.__timer_active = False
 80         self.__timer.join()
 81         self.__thread.join()
 82 
 83     def register(self, ev, handler):
 84         # 事件处理方法注册函数
 85         if ev not in self.__handlers:
 86             self.__handlers[ev] = handler
 87 
 88     def unregister(self, ev):
 89         # 事件处理方法注销函数
 90         if ev in self.__handlers:
 91             del self.__handlers[ev]
 92 
 93     def put(self, ev):
 94         # 推送事件的函数
 95         self.__queue.put(ev)
 96 
 97 
 98 def demo(ev):
 99     print "echo 1 times", ev
100 
101 
102 def w_demo(ev):
103     print "write 1 times", ev
104 
105 
106 # 初始化引擎
107 engine = EventEngine()
108 
109 # 注册两个事件的处理函数到引擎中
110 engine.register(EVENT_TIMER, demo)
111 engine.register(EVENT_WRITE, w_demo)
112 
113 # 启动引擎
114 engine.start(timer=True)
115 
116 print "wait 2 mins"
117 time.sleep(2)
118 engine.put(EVENT_WRITE)
119 engine.stop()

参考链接:

【1】https://zhuanlan.zhihu.com/p/20031696

【2】https://www.jb51.net/article/122099.htm

posted @ 2020-11-27 00:02  5月6号的风  阅读(437)  评论(0)    收藏  举报