[BUG] autobahn/__init__.py eagerly imports flatbuffers → numpy is loaded in every process (regression after 24.4.2)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 58/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- numpy, python
- Ambito
- backend, performance
Direzione di ricerca
Start by reading autobahn/__init__.py and trace its import of flatbuffers to flatbuffers/number_types.py, where NumPy is loaded at module scope. Compare that import path with the 24.4.2 behavior described in the issue, then check the existing tests around package imports and NumPy compatibility. Done means importing Autobahn without using FlatBuffers does not load NumPy, and a broken NumPy installation does not prevent importing Autobahn.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Since some release after 24.4.2, import autobahn imports the vendored flatbuffers
package at module-import time, and flatbuffers imports numpy whenever numpy
happens to be installed. Users who never touch WAMP or FlatBuffers now pay for numpy
in every process.
This reaches well beyond autobahn itself: daphne imports autobahn.twisted.websocket
from its Django AppConfig, so every Django + Channels project that has numpy
anywhere in its environment now loads numpy at django.setup() — web workers,
Celery workers, beat, management commands.
Import chain
daphne/apps.py:6 import daphne.server
daphne/server.py:42
daphne/ws_protocol.py:6 from autobahn.twisted.websocket import ...
autobahn/__init__.py:35 from autobahn import flatbuffers
autobahn/flatbuffers/__init__.py:15 from . import util
autobahn/flatbuffers/util.py:15 from . import encode
autobahn/flatbuffers/encode.py:15 from . import number_types as N
autobahn/flatbuffers/number_types.py:21 np = import_numpy()
autobahn/flatbuffers/compat.py:75 import numpy as np
Two independent things combine here:
autobahn/__init__.pygained an unconditionalfrom autobahn import flatbuffers
(it appears to servecheck_zlmdb_flatbuffers_version_in_sync()). In 24.4.2 that
module imported only_version,osandtxaio.flatbuffers/number_types.pycallsimport_numpy()at module level, and
compat.import_numpy()imports numpy wheneverPathFinder.find_spec("numpy")
succeeds — i.e. "numpy is installed" is treated as "numpy should be loaded".
Impact 1 — memory, for users who never use FlatBuffers
Measured with resource.getrusage(...).ru_maxrss on Python 3.13.13 / numpy 2.4.6
(macOS arm64):
| process | RSS |
|---|---|
| bare interpreter | 16.4 MB |
import txaio (what 24.4.2 pulled in) |
16.3 MB |
import numpy |
29.4 MB |
That is roughly +13 MB per process, multiplied by however many workers a
deployment runs. For a Django deployment with web + Celery + beat + a few
background workers this is a noticeable, invisible regression: nothing in the
application asks for numpy.
Impact 2 — a broken numpy now prevents importing autobahn at all
import_numpy() imports numpy deliberately outside try/except, with the comment
"We do this outside of try/except block in case numpy exists but is not installed
correctly". Combined with the eager import in __init__.py, a numpy whose import
fails — for example an ABI mismatch of the kind described in #1890 — makes
autobahn itself unimportable, and with it daphne and the whole Django app.
Reproducer for that failure mode:
import sys
class Block:
def find_spec(self, name, path=None, target=None):
if name == "numpy":
raise ImportError("simulating a broken numpy install")
return None
sys.meta_path.insert(0, Block())
import autobahn.twisted.websocket # ImportError, raised from autobahn/__init__.py:35
Reproducer showing the import chain itself:
import sys, traceback
class Hook:
def find_spec(self, name, path=None, target=None):
if name == "numpy":
traceback.print_stack()
sys.meta_path.remove(self)
return None
sys.meta_path.insert(0, Hook())
import autobahn.twisted.websocket
print("numpy" in sys.modules) # True
Suggested fixes
Any one of these removes the cost for users who do not use FlatBuffers:
- Move
from autobahn import flatbuffersinside
check_zlmdb_flatbuffers_version_in_sync()(or behind a lazy accessor), so that
importing autobahn does not import the serializer. - Resolve numpy lazily in
number_types.pyinstead of at module-import time. - At minimum, wrap the numpy import in
try/except ImportError, so a broken numpy
degrades to "FlatBuffers numpy features unavailable" instead of
"autobahn cannot be imported".
Options 1 and 2 are independent and either alone fixes the memory issue; 3 addresses
the robustness issue.
Environment
autobahn 26.7.1, daphne 4.2.2, numpy 2.4.6, Python 3.13.13, macOS arm64.
Noticed while upgrading autobahn to 26.7.1 for CVE-2026-77528: a guard test asserting
that numpy is absent from the Django setup import graph started failing.
- Lingua principale
- Python
- Stelle
- 2.5k
- Fork
- 769
- Merge medio
- 1g 12h
- PR unite (30g)
- 15
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di crossbario/autobahn-python
-
CI-CD enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
crossbario/autobahn-python#1945 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug CI-CD
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
crossbario/autobahn-python#1932 ·
I maintainer di solito rispondono entro 1 giorno
-
CI-CD enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
crossbario/autobahn-python#1829 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
crossbario/autobahn-python#1963 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
crossbario/autobahn-python#1962 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di crossbario/autobahn-python
Issue simili
-
bug Triage-Needed
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
FuRongJun-1999/dsh-memory#170 ·
I maintainer di solito rispondono entro 1 giorno
-
[开源推荐] 打拼音就出篆书的输入法,附古文字创作小工具Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
521xueweihan/HelloGitHub#3940 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100