python:event_manager
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
python:event_manager [2016/02/01 06:40] – 만듦 rex8312 | python:event_manager [2024/03/23 02:42] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Python: Event Manager ====== | ====== Python: Event Manager ====== | ||
- | <code python> | + | <code python |
- | from threading import Timer | + | # -*-coding: utf-8 -*- |
+ | __author__ = ' | ||
- | class Singleton(type): | + | import time |
- | __instances = {} | + | |
+ | |||
+ | class Singleton(type): | ||
+ | _instances = {} | ||
+ | |||
def __call__(cls, | def __call__(cls, | ||
- | if cls not in cls.__instances: | + | if cls not in cls._instances: |
- | cls.__instances[cls] = super(Singleton, | + | cls._instances[cls] = super(Singleton, |
- | return cls.__instances[cls] | + | return cls._instances[cls] |
- | class Event(list): | + | class EventManager(metaclass=Singleton): |
- | __metaclass__ | + | |
- | | + | |
def __init__(self): | def __init__(self): | ||
- | | + | self.listeners = dict() |
- | self.event_manager = None | + | |
- | self.name = None | + | |
- | def add_handler(self, | + | def register_listener(self, |
- | self.append(handler) | + | self.listeners.setdefault(event_type, |
- | | + | self.listeners[event_type].append(listener) |
- | def remove_handler(self, | + | def unregister_listener(self, |
- | self.remove(handler) | + | |
- | return self | + | self.listeners[event_type].remove(listener) |
- | def fire(self, | + | def post(self, |
- | for handler | + | event_type = type(event) |
- | | + | listeners = self.listeners[event_type] |
+ | for listener | ||
+ | | ||
- | __iadd__ = add_handler | ||
- | __isub__ = remove_handler | ||
- | __call__ = fire | ||
+ | class TickEvent: | ||
+ | def __init__(self): | ||
+ | super().__init__() | ||
+ | import random | ||
+ | self.value = random.random() | ||
- | class EventManager(dict): | + | |
- | | + | class TickHandler: |
- | + | def notify(self, event): | |
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | class TockEvent: | ||
def __init__(self): | def __init__(self): | ||
- | super(EventManager, | + | super().__init__() |
+ | import random | ||
+ | self.value = random.random() | ||
- | def __getattr__(self, | ||
- | return self[event] | ||
- | | + | class TockHandler: |
- | | + | |
+ | | ||
- | def register_event(self, | ||
- | self[name] = Event() | ||
- | self[name].name = name | ||
- | self[name].event_manager = self | ||
+ | class CPUSpinner(object): | ||
+ | def run(self): | ||
+ | while True: | ||
+ | EventManager().post(TickEvent()) | ||
+ | time.sleep(1) | ||
+ | |||
+ | |||
+ | if __name__ == ' | ||
+ | |||
+ | EventManager().register_listener(TickHandler().notify, | ||
+ | EventManager().register_listener(TockHandler().notify, | ||
+ | CPUSpinner().run() | ||
- | class Scheduler: | ||
- | @staticmethod | ||
- | def ticking(interval, | ||
- | if iteration != 1: | ||
- | Timer(interval, | ||
- | func() | ||
</ | </ | ||
+ | |||
+ | {{tag> |
python/event_manager.1454308811.txt.gz · 마지막으로 수정됨: (바깥 편집)