Python EventManager 实现:多线程事件监听与处理
下面是一个示例实现 EventManager 的代码,使用 Python 实现多线程事件监听与处理,支持添加事件监听器、触发事件和自定义事件回调函数。
import threading
import time
class EventManager:
def __init__(self):
self.event_listeners = {}
self.event_lock = threading.Lock()
self.ticking_counter = 0
def add_event_listener(self, event, callback):
with self.event_lock:
if event not in self.event_listeners:
self.event_listeners[event] = []
self.event_listeners[event].append(callback)
def send_event(self, event, data):
with self.event_lock:
if event in self.event_listeners:
for callback in self.event_listeners[event]:
callback(data)
def start(self):
threading.Thread(target=self._tick).start()
def _tick(self):
for i in range(100):
time.sleep(0.1)
self.send_event('ticking', [i])
self.ticking_counter += 1
if self.ticking_counter == 2:
self.send_event('onParking', [])
self.ticking_counter = 0
def update_list(data):
print('Update list:', data)
def parking_ended():
print('Parking ended')
if __name__ == '__main__':
event_manager = EventManager()
event_manager.add_event_listener('ticking', update_list)
event_manager.add_event_listener('onParking', parking_ended)
event_manager.start()
在这个示例实现中,EventManager 类有两个主要方法:add_event_listener 和 send_event。add_event_listener 用于添加事件监听器,send_event 用于触发事件。EventManager 内部使用一个字典 event_listeners 来存储每个事件对应的回调函数列表。在 send_event 方法中,会遍历对应事件的回调函数列表,并依次调用回调函数。
在 start 方法中,会启动一个独立的线程来执行 _tick 方法。_tick 方法中的循环会不断发送 'ticking' 事件,并在每次发送后检查 ticking_counter 的值。当 ticking_counter 等于 2 时,会发送 'onParking' 事件,并将 ticking_counter 重置为 0。
在示例的 if name == 'main': 部分,我们创建了一个 EventManager 实例,并添加了 'ticking' 事件和 'onParking' 事件的回调函数。然后调用 start 方法启动 EventManager 的线程。这样,在循环中不断触发 'ticking' 事件,并在满足条件时触发 'onParking' 事件,从而触发相应的回调函数。
EventManager 类通过多线程机制实现了事件监听与处理,并提供了灵活的事件处理机制,方便用户根据需要定制事件回调函数。
总结
- EventManager 类使用字典存储事件监听器,支持添加、触发事件和自定义事件回调函数。
- 通过多线程机制,EventManager 类可以在独立线程中持续触发事件,并调用相应的回调函数。
- 示例代码展示了如何使用 EventManager 类处理定时事件和特定事件,并演示了事件回调函数的调用。
应用场景
- 游戏引擎:处理玩家操作、游戏逻辑等事件。
- 异步编程:处理网络请求、数据库操作等异步任务。
- GUI 应用程序:处理用户界面事件。
- 数据采集:处理数据更新、数据分析等事件。
原文地址: https://www.cveoy.top/t/topic/qCCI 著作权归作者所有。请勿转载和采集!