基于python的事件处理模型

本文介绍了一个简单的事件驱动编程模型实现,包括事件、事件源、事件总线等核心组件的设计与应用。通过具体示例展示了如何注册事件监听器,并在特定事件触发时执行相应的业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.事件、事件源,事件注册机与分发器

# -*- coding: utf-8 -*-


from enum import Enum
from collections import defaultdict


class Event(object):
    def __init__(self, event_type, **kwargs):
        self.__dict__ = kwargs
        self.event_type = event_type

    def __repr__(self):
        return ' '.join('{}:{}'.format(k, v) for k, v in self.__dict__.items())

class EventBus(object):
    def __init__(self):
        self._listeners = defaultdict(list)
        self._listeners[EVENT.PRE_EAT].append(self._pre_eat)
        self._listeners[EVENT.POST_EAT].append(self._post_eat)
        self._listeners[EVENT.PRE_SLEEP].append(self._pre_sleep)

    def add_listener(self, event, listener):
        self._listeners[event].append(listener)

    def prepend_listener(self, event, listener):
        self._listeners[event].insert(0, listener)

    def publish_event(self, event):
        for l in self._listeners[event.event_type]:
            # # 如果返回 True ,那么消息不再传递下去
            if l(event):
                break

    def _pre_eat(self,event):
        print('吃饭前先洗手')

    def _post_eat(self,event):
        print('吃饭后洗碗')

    def _pre_sleep(self,event):
        print('睡觉请关灯')


class EventSource(object):

    def __init__(self):
        self.events = []

    def add(self,event):
        self.events.append(event)


class EVENT(Enum):
    # 吃饭
    EAT = 'eat'
    #睡觉
    SLEEP = 'sleep'
    # 吃饭前触发
    PRE_EAT = 'pre_eat'
    #吃饭后触发
    POST_EAT = 'post_eat'
    # 睡觉前触发
    PRE_SLEEP = 'pre_sleep'

def parse_event(event_str):
    return EVENT.__members__.get(event_str.upper(), None)

2.存放事件源和事件注册机以及分发器的环境

# -*- coding: utf-8 -*-


from event import EventBus,EventSource

class Environment(object):
    _env = None

    def __init__(self):
        Environment._env = self
        self.event_source = EventSource()
        self.event_bus = EventBus()

    @classmethod
    def get_instance(cls):
        """
        返回已经创建的 Environment 对象
        """
        if Environment._env is None:
            raise RuntimeError(
                _(u"Environment has not been created. Please Use `Environment.get_instance()` after RQAlpha init"))
        return Environment._env

3.睡觉事件处理业务以及事件注册

# -*- coding: utf-8 -*-

from env import  Environment
from event import EVENT

class sleep():
    def register_event(self, event_bus):
        event_bus = Environment.get_instance().event_bus
        event_bus.prepend_listener(EVENT.SLEEP, self._on_sleep)

    def _on_sleep(self, event):
        print('开始睡觉了')

4.吃饭事件业务处理及事件注册

# -*- coding: utf-8 -*-
from env import  Environment
from event import EVENT

class eat():
    def register_event(self, event_bus):
        event_bus.prepend_listener(EVENT.EAT, self._on_eat)

    def _on_eat(self, event):
        print('开始吃晚饭了')

5.事件执行器加AOP:

# -*- coding: utf-8 -*-


from event import EVENT, Event


PRE_EAT = Event(EVENT.PRE_EAT)
POST_EAT = Event(EVENT.POST_EAT)
PRE_SLEEP = Event(EVENT.PRE_SLEEP)

class Executor(object):
    def __init__(self, env):
        self._env = env

    def run(self):

        event_bus = self._env.event_bus

        for event in self._env.event_source.events:
            if event.event_type == EVENT.EAT:
                event_bus.publish_event(PRE_EAT)
                event_bus.publish_event(event)
                event_bus.publish_event(POST_EAT)
            elif event.event_type == EVENT.SLEEP:
                event_bus.publish_event(PRE_SLEEP)
                event_bus.publish_event(event)
            else:
                event_bus.publish_event(event)
6.测试
# -*- coding: utf-8 -*-
from env import Environment
from  executor import Executor
from  event import Event, EVENT
from eat import eat
from sleep import  sleep
def test():

    env = Environment()
    #事件注册
    eat().register_event(env.event_bus)
    sleep().register_event(env.event_bus)
    #事件发生
    env.event_source.add(Event(EVENT.EAT))
    env.event_source.add(Event(EVENT.SLEEP))
    #启动事件驱动
    Executor(env).run()

test()
测试结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值