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

浙公网安备 33010602011771号