|
3 | 3 | import collections.abc as collections |
4 | 4 | import numbers |
5 | 5 | import warnings |
| 6 | +import weakref |
6 | 7 | from abc import ABCMeta, abstractmethod |
7 | 8 | from collections import OrderedDict |
8 | 9 | from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union |
@@ -261,18 +262,34 @@ def attach( |
261 | 262 | :class:`~ignite.engine.events.RemovableEventHandle`, which can be used to remove the handler. |
262 | 263 | """ |
263 | 264 | if isinstance(event_name, EventsList): |
| 265 | + # Use weak reference to break circular reference: engine -> _event_handlers -> BaseLogger |
| 266 | + weak_self = weakref.ref(self) |
| 267 | + |
| 268 | + def weak_log_handler(engine, event_name): |
| 269 | + logger_obj = weak_self() |
| 270 | + if logger_obj is not None: |
| 271 | + log_handler(engine, logger_obj, event_name) |
| 272 | + |
264 | 273 | for name in event_name: |
265 | 274 | if name not in State.event_to_attr: |
266 | 275 | raise RuntimeError(f"Unknown event name '{name}'") |
267 | | - engine.add_event_handler(name, log_handler, self, name) |
| 276 | + engine.add_event_handler(name, weak_log_handler, name) |
268 | 277 |
|
269 | 278 | return RemovableEventHandle(event_name, log_handler, engine) |
270 | 279 |
|
271 | 280 | else: |
272 | 281 | if event_name not in State.event_to_attr: |
273 | 282 | raise RuntimeError(f"Unknown event name '{event_name}'") |
274 | 283 |
|
275 | | - return engine.add_event_handler(event_name, log_handler, self, event_name, *args, **kwargs) |
| 284 | + # Use weak reference to break circular reference: engine -> _event_handlers -> BaseLogger |
| 285 | + weak_self = weakref.ref(self) |
| 286 | + |
| 287 | + def weak_log_handler(engine): |
| 288 | + logger_obj = weak_self() |
| 289 | + if logger_obj is not None: |
| 290 | + log_handler(engine, logger_obj, event_name, *args, **kwargs) |
| 291 | + |
| 292 | + return engine.add_event_handler(event_name, weak_log_handler) |
276 | 293 |
|
277 | 294 | def attach_output_handler(self, engine: Engine, event_name: Any, *args: Any, **kwargs: Any) -> RemovableEventHandle: |
278 | 295 | """Shortcut method to attach `OutputHandler` to the logger. |
|
0 commit comments