| 122 | self.register_listeners(event_listeners) |
| 123 | |
| 124 | def dispatch(self, event: object): |
| 125 | # Snapshot listeners under the lock, then release it before invoking |
| 126 | # them. Holding the lock across listener execution would turn any |
| 127 | # listener that calls register_listeners / unregister_listeners / |
| 128 | # dispatch back into the dispatcher into a deadlock. |
| 129 | with self._lock: |
| 130 | listeners = list(self._event_listeners_mapping.get(type(event), [])) |
| 131 | for listener in listeners: |
| 132 | listener.listen(event) |
| 133 | |
| 134 | async def dispatch_async(self, event: object): |
| 135 | if self._async_lock is None: |