class _QueueEventEngine(object): """ 计时器使用python线程的事件驱动引擎 """ def __init__(self): """初始化事件引擎""" # 事件队列 self._queue = Queue() self._active = False self._routes = {} self._thread = Thread(target=self._run) self._thread.daemon = True def start(self): """引擎启动""" #print self._routes self._active = True self._thread.start() def stop(self): """停止引擎""" self._active = False self._timer_active = False # 等待事件处理线程退出 #self._thread.join() def register(self, route, handler): """注册事件处理函数监听, 不重复注册同样事件的同样回调。 """ if route not in self._routes: self._routes[route] = [handler] return handlers = self._routes[route] if handler not in handlers: handlers.append(handler) def unregister(self, route, handler): """注销事件处理函数监听""" try: handlerList = self._routes[route] # 如果该函数存在于列表中,则移除 if handler in handlerList: handlerList.remove(handler) # 如果函数列表为空,则从引擎中移除该事件类型 if not handlerList: del self._routes[route] except KeyError: pass def emit(self, event): """向事件队列中存入事件""" self._queue.emit(event) def _run(self): """引擎运行""" while self._active == True: try: # 获取事件的阻塞时间设为1秒 event = self._queue.get(block=True, timeout=1) self._process(event) except Empty: pass def _process(self, event): """处理事件""" if event.route in self._routes: for handler in self._routes[event.route]: try: handler(event) except Exception as e: print e