nas-tools/app/plugins/event_manager.py
2023-02-15 20:47:47 +08:00

106 lines
2.5 KiB
Python

from queue import Queue, Empty
import log
from app.utils.commons import singleton
from app.utils.types import EventType
@singleton
class EventManager:
"""
事件管理器
"""
# 事件队列
_eventQueue = None
# 事件响应函数字典
_handlers = {}
def __init__(self):
self.init_config()
def init_config(self):
# 事件队列
self._eventQueue = Queue()
# 事件响应函数字典
self._handlers = {}
def get_event(self):
"""
获取事件
"""
try:
event = self._eventQueue.get(block=True, timeout=1)
handlerList = self._handlers.get(event.event_type)
return event, handlerList
except Empty:
return None, []
def add_event_listener(self, etype: EventType, handler):
"""
注册事件处理
"""
try:
handlerList = self._handlers[etype.value]
except KeyError:
handlerList = []
self._handlers[etype.value] = handlerList
if handler not in handlerList:
handlerList.append(handler)
log.info(f"已注册事件:{handler}")
def remove_event_listener(self, etype: EventType, handler):
"""
移除监听器的处理函数
"""
try:
handlerList = self._handlers[etype.value]
if handler in handlerList:
handlerList.remove(handler)
if not handlerList:
del self._handlers[etype.value]
except KeyError:
pass
def send_event(self, etype: EventType, data: dict = None):
"""
发送事件
"""
if etype not in EventType:
return
event = Event(etype.value)
event.event_data = data or {}
self._eventQueue.put(event)
def register(self, etype: [EventType, list]):
"""
事件注册
:param etype: 事件类型
"""
def decorator(f):
if isinstance(etype, list):
for et in etype:
self.add_event_listener(et, f)
else:
self.add_event_listener(etype, f)
return f
return decorator
class Event(object):
"""
事件对象
"""
def __init__(self, event_type=None):
# 事件类型
self.event_type = event_type
# 字典用于保存具体的事件数据
self.event_data = {}
# 实例引用,用于注册事件
EventHandler = EventManager()