@@ -141,6 +141,7 @@ class Watcher(Generic[T]):
141141 "_deps" ,
142142 "_new_deps" ,
143143 "_number_of_callback_args" ,
144+ "_tasks" ,
144145 "callback" ,
145146 "callback_async" ,
146147 "deep" ,
@@ -185,6 +186,7 @@ def __init__(
185186 if deep is None :
186187 deep = True
187188 self ._deps , self ._new_deps = WeakSet (), WeakSet ()
189+ self ._tasks = set ()
188190
189191 self .sync = sync
190192 if callable (callback ):
@@ -265,11 +267,13 @@ def run_callback(self, new, old) -> None:
265267 self ._number_of_callback_args = 2
266268
267269 if self .callback_async and maybe_coro :
268- loop = asyncio .get_event_loop_policy (). get_event_loop ()
270+ loop = asyncio .get_event_loop ()
269271 if not loop .is_running ():
270272 loop .run_until_complete (maybe_coro )
271273 else :
272- loop .create_task (maybe_coro )
274+ task = loop .create_task (maybe_coro )
275+ self ._tasks .add (task )
276+ task .add_done_callback (self ._tasks .discard )
273277
274278 def _run_callback (self , * args ) -> None :
275279 """
@@ -296,11 +300,13 @@ def get(self) -> Any:
296300 try :
297301 value_or_coro = self .fn ()
298302 if self .fn_async and value_or_coro :
299- loop = asyncio .get_event_loop_policy (). get_event_loop ()
303+ loop = asyncio .get_event_loop ()
300304 if not loop .is_running ():
301305 value_or_coro = loop .run_until_complete (value_or_coro )
302306 else :
303- loop .create_task (value_or_coro )
307+ task = loop .create_task (value_or_coro )
308+ self ._tasks .add (task )
309+ task .add_done_callback (self ._tasks .discard )
304310 return
305311 if self .deep :
306312 traverse (value_or_coro )
0 commit comments