사용자 도구

사이트 도구


python:event_manager

Python: Event Manager

event_manager.py
# -*-coding: utf-8 -*-
 
__author__ = 'rex8312'
 
import time
 
 
class Singleton(type):
    _instances = {}
 
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
 
 
class EventManager(metaclass=Singleton):
    def __init__(self):
        self.listeners = dict()
 
    def register_listener(self, listener, event_type):
        self.listeners.setdefault(event_type, list())
        self.listeners[event_type].append(listener)
 
    def unregister_listener(self, listener, event_type):
        if event_type in self.listeners:
            self.listeners[event_type].remove(listener)
 
    def post(self, event):
        event_type = type(event)
        listeners = self.listeners[event_type]
        for listener in listeners:
            listener(event)
 
 
class TickEvent:
    def __init__(self):
        super().__init__()
        import random
        self.value = random.random()
 
 
class TickHandler:
    def notify(self, event):
        print('tick', event.value)
        EventManager().post(TockEvent())
 
 
class TockEvent:
    def __init__(self):
        super().__init__()
        import random
        self.value = random.random()
 
 
class TockHandler:
    def notify(self, event):
        print('tock', event.value)
 
 
class CPUSpinner(object):
    def run(self):
        while True:
            EventManager().post(TickEvent())
            time.sleep(1)
 
 
if __name__ == '__main__':
 
    EventManager().register_listener(TickHandler().notify, TickEvent)
    EventManager().register_listener(TockHandler().notify, TockEvent)
    CPUSpinner().run()
python/event_manager.txt · 마지막으로 수정됨: 2024/03/23 02:42 저자 127.0.0.1