Memory leak: page.on() event listeners never removed on close

Abierto Apto para principiantes
#57 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
playwright, python
Área
tooling

Línea de trabajo

Lee local_browser.py alrededor de _attach_page_listeners() en las líneas 370-372 y _close_async() en la línea 533; después, rastrea cómo se borra self._page en la línea 541. Confirma que los controladores de console y pageerror se desvinculan durante el cierre y que se borra el estado de limpieza, sin que escapen errores al eliminar listeners.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Description

In local_browser.py, _attach_page_listeners() (line 370-372) registers page.on('console', ...) and page.on('pageerror', ...) handlers, but these are never removed in _close_async() (line 533).

The _close_async() method nullifies the self._page reference (line 541) but never calls page.remove_listener(). The Playwright pyee event emitter retains references to the bound methods, creating a memory leak.

Impact

  • Over long agent runs, listener references accumulate
  • Each listener closure captures the bound method, preventing GC
  • Memory grows linearly with agent steps
  • This is a known pattern - the Playwright Python repo has multiple confirmed reports of memory leaks from orphaned page.on() handlers

Suggested Fix

Store the listener removal in a cleanup list and call _detach_page_listeners() at the start of _close_async():

def _attach_page_listeners(self, page):
    def on_console(msg): self._on_console_message(msg)
    def on_page_error(err): self._on_page_error(err)
    page.on("console", on_console)
    page.on("pageerror", on_page_error)
    self._page_cleanup = [
        lambda: page.remove_listener("console", on_console),
        lambda: page.remove_listener("pageerror", on_page_error),
    ]

def _detach_page_listeners(self):
    for cleanup in self._page_cleanup:
        try:
            cleanup()
        except Exception:
            pass
    self._page_cleanup = []
Lenguaje dominante
Python
Estrellas
6k
Forks
385
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/Webwright

Todos los issues de microsoft/Webwright

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.