基於python的事件處理模型
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()
測試結果:
相關文章
- java事件處理模型是什麼Java事件模型
- 【筆記】基於Python的數字影象處理筆記Python
- 使用EventNext實現基於事件驅動的業務處理事件
- 關於Android的幾種事件處理Android事件
- 技術文件:基於 Python 的影像處理系統Python
- [python] 基於Tablib庫處理表格資料Python
- 進化計算中基於分類的預處理代理模型模型
- 事件處理事件
- 關於Python中的日期處理Python
- 基於SceneKit的3D模型觸碰事件3D模型事件
- 基於Python的Xgboost模型實現Python模型
- freeswitch的event事件處理事件
- React事件處理React事件
- vue事件處理Vue事件
- JavaSwing 事件處理Java事件
- JavaScript事件處理JavaScript事件
- Flutter | 事件處理Flutter事件
- 基於 React Redux 的錯誤處理ReactRedux
- 基於Opencv的簡單影像處理OpenCV
- Python 自然語言處理(基於jieba分詞和NLTK)Python自然語言處理Jieba分詞
- 基於Python的Excel處理工具PythonExcel
- Python基礎 -- 異常處理Python
- [資料處理]python基礎Python
- W3C的事件處理和IE的事件處理有哪些區別?事件
- redis的事件處理機制Redis事件
- 基於python的大資料分析-資料處理(程式碼實戰)Python大資料
- 快手關於海量模型資料處理的實踐模型
- react之事件處理React事件
- 事件分發之View事件處理事件View
- python 基礎之異常處理Python
- Scapy 2.4.0 釋出,基於 Python 的互動式資料包處理庫Python
- React 中常用的事件處理方式React事件
- Python影像處理初探:Pillow庫的基礎使用Python
- 事件分發和處理事件
- Laravel 事件&非同步處理Laravel事件非同步
- [轉] Scala 中的非同步事件處理非同步事件
- Nginx 超時事件的處理機制Nginx事件
- nginx 是如何處理過期事件的?Nginx事件