|
17 | 17 | __all__ = ["Engine"] |
18 | 18 |
|
19 | 19 |
|
| 20 | +REF_COUNTER = 0 |
| 21 | + |
20 | 22 | class Engine(Serializable): |
21 | 23 | """Runs a given ``process_function`` over each batch of a dataset, emitting events as it goes. |
22 | 24 |
|
@@ -163,6 +165,21 @@ def __init__(self, process_function: Callable[["Engine", Any], Any]): |
163 | 165 | # generator provided by self._internal_run_as_gen |
164 | 166 | self._internal_run_generator: Optional[Generator[Any, None, State]] = None |
165 | 167 |
|
| 168 | + def __del__(self) -> None: |
| 169 | + """Finalize the engine.""" |
| 170 | + self._event_handlers.clear() |
| 171 | + print("__del__", self) |
| 172 | + print("Cleared event handlers for {}".format(self)) |
| 173 | + # global REF_COUNTER |
| 174 | + # REF_COUNTER += 1 |
| 175 | + # print("counter", REF_COUNTER) |
| 176 | + # try to clear event handlers to break circular references |
| 177 | + # try: |
| 178 | + # self._event_handlers.clear() |
| 179 | + # print("Cleared event handlers for {}".format(self)) |
| 180 | + # except Exception: |
| 181 | + # pass |
| 182 | + |
166 | 183 | def register_events( |
167 | 184 | self, *event_names: Union[List[str], List[EventEnum]], event_to_attr: Optional[dict] = None |
168 | 185 | ) -> None: |
@@ -328,6 +345,7 @@ def execute_something(): |
328 | 345 |
|
329 | 346 | try: |
330 | 347 | _check_signature(handler, "handler", self, *(event_args + args), **kwargs) |
| 348 | + # self._event_handlers[event_name].append((handler, (weakref.ref(self),) + args, kwargs)) |
331 | 349 | self._event_handlers[event_name].append((handler, (self,) + args, kwargs)) |
332 | 350 | except ValueError: |
333 | 351 | _check_signature(handler, "handler", *(event_args + args), **kwargs) |
@@ -433,6 +451,15 @@ def _fire_event(self, event_name: Any, *event_args: Any, **event_kwargs: Any) -> |
433 | 451 | for func, args, kwargs in self._event_handlers[event_name]: |
434 | 452 | kwargs.update(event_kwargs) |
435 | 453 | first, others = ((args[0],), args[1:]) if (args and args[0] == self) else ((), args) |
| 454 | + # if args and isinstance(args[0], weakref.ref): |
| 455 | + # resolved_engine = args[0]() |
| 456 | + # if resolved_engine is None: |
| 457 | + # raise RuntimeError("Engine reference not resolved. Cannot execute event handler.") |
| 458 | + # first, others = ((resolved_engine,), args[1:]) |
| 459 | + # else: |
| 460 | + # # metrics do not provide engine when registered |
| 461 | + # first, others = (tuple(), args) # type: ignore[assignment] |
| 462 | + |
436 | 463 | func(*first, *(event_args + others), **kwargs) |
437 | 464 |
|
438 | 465 | def fire_event(self, event_name: Any) -> None: |
|
0 commit comments