Free-threaded Python (3.14t/3.15t): importing _objtrace re-enables the GIL
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 39/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- python
- Área
- backend, build-system, documentation, performance, testing
Línea de trabajo
Start with scout_apm/core/objtrace.py and the _objtrace C extension; inspect how the fallback is selected and where the extension declares module slots. Then review .github/workflows/main.yml and the tox environment selection for Python 3.14t and 3.15t. The issue proposes a short term fallback and CI coverage, while making the extension free-threading safe requires investigation and stress tests.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
We publish free-threaded wheels (cp314t and cp315t). For example, scout-apm 4.0.0 on PyPI includes scout_apm-4.0.0-cp314-cp314t-*.whl, and cibuildwheel builds cp315t wheels on master. But nothing in CI tests the free-threaded builds, and the _objtrace C extension never declares that it's safe to run without the GIL. It has no Py_mod_gil slot.
So when scout_apm.core.install() imports scout_apm.core._objtrace on a free-threaded interpreter, CPython turns the GIL back on for the whole process:
RuntimeWarning: The global interpreter lock (GIL) has been enabled to load module 'scout_apm.core._objtrace', which has not declared that it can run safely without the GIL. To override this behavior and keep the GIL disabled (at your own risk), run with PYTHON_GIL=0 or -Xgil=0.
The impact:
- Any free-threaded app with scout-apm installed quietly loses free-threading.
sys._is_gil_enabled()becomesTrueafter the import. - When warnings are errors (
-W error, or our ownpytest.ini), the import raisesRuntimeWarning. The fallback inobjtrace.pyonly catchesImportError, so the exception isn't handled. A free-threaded CI job would fail on this right away.
Reproduce
uv venv -p 3.15t venv && VIRTUAL_ENV=venv uv pip install "scout-apm @ ."
venv/bin/python -c "import sys; from scout_apm.core import objtrace; print(objtrace.is_extension, sys._is_gil_enabled())"
# RuntimeWarning as above, then: True True
What objtrace provides
objtrace only produces the per-span allocation tags: allocations, start_allocations and stop_allocations (tracked_request.py, add_allocation_tags). Memory increase per request (RSS via psutil) and the memory sampler don't depend on it. The agent already runs without objtrace on PyPy, with SCOUT_DISABLE_EXTENSIONS=1, and whenever the optional extension fails to compile. In those cases add_allocation_tags() just skips the tags.
Proposed plan
- Short term: on free-threaded builds, use the existing no-op fallback in
objtrace.pyinstead of importing the extension, for example whensysconfig.get_config_var("Py_GIL_DISABLED")is set. The GIL stays off, and allocation tags are skipped like they are on PyPy. - CI: add
3.14tand3.15tjobs, withpy314t-*andpy315t-*tox envs. The env selection inmain.ymlcurrently strips the version down to digits (3.15tbecomes315) and matches^py315as a prefix, so it would also need to match thetsuffix exactly. - Longer term (needs investigation): make
_objtraceactually safe without the GIL and declarePy_MOD_GIL_NOT_USED. The counters are already thread-local (__thread). The open questions:enable()anddisable()read and writeinstalledwithout a lock. A concurrent doubleenable()would wrap our own hook and recurse infinitely.- We'd need to confirm whether calling
PyMem_SetAllocatorat runtime, while other threads are allocating, is safe on free-threaded CPython. - Stress tests on 3.14t/3.15t would be needed before shipping.
- Docs: say which Python builds and interpreters report allocation counts. Today the docs don't mention objtrace, PyPy or
SCOUT_DISABLE_EXTENSIONSat all.
Found while adding Python 3.15 CI in #866.
- Lenguaje dominante
- Python
- Estrellas
- 77
- Forks
- 19
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de scoutapp/scout_apm_python
-
Python 3.15 crash - KeyError on distribution.metadata Name accessPosiblemente ocupada @quinnmil la tomó hoy. Abierto
scoutapp/scout_apm_python#864 · 2 comentarios · 1 asignado ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 1/100
scoutapp/scout_apm_python#854 ·
-
redis-py 7.4.0 fixes password leak in ConnectionPool repr and exposes OTel classesQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertobotwork
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
scoutapp/scout_apm_python#841 ·
-
Celery 5.6.3 removes deprecated redis get_connection args — verify Scout instrumentationQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertobotwork
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
scoutapp/scout_apm_python#837 ·
-
Ensure Elasticsearch 9 compatAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
scoutapp/scout_apm_python#815 ·
Todos los issues de scoutapp/scout_apm_python
Issues similares
-
component:benchmark
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
agentic-os-org/ANOLISA#9177 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
distrochooser/distrochooser#520 ·
Los mantenedores suelen responder en 2 días
-
Status: Needs confirmation Status: Needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
Los mantenedores suelen responder en 1 día
-
[BUG] Published Docker images lack the redis extra: HEADROOM_COMPRESS_SESSION_STORE stops startupPosiblemente ocupada @AlessandroSpallina la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
headroomlabs-ai/headroom#4513 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 65/100
codespell-project/codespell#4060 ·
Los mantenedores suelen responder en 1 día