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 · 마지막으로 수정됨: (바깥 편집)