2121
2222from __future__ import annotations
2323
24- from asyncio import CancelledError , Future , create_task
24+ from asyncio import CancelledError , Future , Task , create_task , gather
2525from collections import defaultdict
2626from logging import getLogger
2727from typing import TYPE_CHECKING , Generic , Hashable , TypeVar , cast , overload
@@ -423,7 +423,7 @@ async def wait_for(
423423 return result # type: ignore [return-value]
424424
425425 # Dispatching
426- async def dispatch (self , event_name : EventNameT , * args : Any ) -> None :
426+ async def dispatch (self , event_name : EventNameT , * args : Any , wait : bool = False ) -> None :
427427 """Dispatch a event
428428
429429 **Example usage:**
@@ -438,25 +438,35 @@ async def dispatch(self, event_name: EventNameT, *args: Any) -> None:
438438 The event name to dispatch to.
439439 args:
440440 The event arguments. This will be passed to the listeners.
441+ wait:
442+ Wait for all listeners to complete.
441443 """
442444 logger .debug ("Dispatching event %s" , event_name )
443445
446+ tasks : list [Task [None ]] = []
447+
444448 # Event handlers
445449 # Tasks are used here as some event handler/check might take a long time.
446450 for handler in self ._global_event_handlers :
447451 logger .debug ("Dispatching to a global handler" )
448- create_task (self ._run_global_event_handler (handler , event_name , * args ))
452+ tasks . append ( create_task (self ._run_global_event_handler (handler , event_name , * args ) ))
449453 for handler in self ._event_handlers .get (event_name , []):
450454 logger .debug ("Dispatching to a local handler" )
451- create_task (self ._run_event_handler (handler , event_name , * args ))
455+ tasks . append ( create_task (self ._run_event_handler (handler , event_name , * args ) ))
452456
453457 # Wait for handlers
454458 for check , future in self ._wait_for_handlers .get (event_name , []):
455459 logger .debug ("Dispatching to a wait_for handler" )
456- create_task (self ._run_wait_for_handler (check , future , event_name , * args ))
460+ tasks . append ( create_task (self ._run_wait_for_handler (check , future , event_name , * args ) ))
457461 for check , future in self ._global_wait_for_handlers :
458462 logger .debug ("Dispatching to a global wait_for handler" )
459- create_task (self ._run_global_wait_for_handler (check , future , event_name , * args ))
463+ tasks .append (create_task (self ._run_global_wait_for_handler (check , future , event_name , * args )))
464+
465+ # Optional waiting
466+ logger .debug ("Dispatching via %s tasks" , len (tasks ))
467+
468+ if wait :
469+ await gather (* tasks )
460470
461471 async def _run_event_handler (self , callback : EventCallback , event_name : EventNameT , * args : Any ) -> None :
462472 """Run event with exception handlers"""
0 commit comments