[BUG] autobahn/__init__.py eagerly imports flatbuffers → numpy is loaded in every process (regression after 24.4.2)
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 58/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- numpy, python
- 領域
- backend, performance
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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.
- 主要言語
- Python
- スター
- 2.5k
- フォーク
- 769
- 平均マージ
- 1日 12時間
- マージ済み PR(30日)
- 15
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
crossbario/autobahn-python のほかの issue
-
CI-CD enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
crossbario/autobahn-python#1945 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug CI-CD
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
crossbario/autobahn-python#1932 ·
メンテナーはふだん 1 日以内に返信
-
CI-CD enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
crossbario/autobahn-python#1829 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
crossbario/autobahn-python#1963 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 68/100
crossbario/autobahn-python#1962 ·
メンテナーはふだん 1 日以内に返信
crossbario/autobahn-python の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
spec-kitty/spec-kitty#6112 ·
メンテナーはふだん 1 日以内に返信
-
[Bug]: OpenRouter streaming chunks report the requested router name instead of the model OpenRouter served対応中かも @Mrun25 が今日担当しました。 オープンbug llm translation
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
BerriAI/litellm#46095 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
uberdeveloper/fastbt#29 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
andrew-blake/melcloudhome#368 ·
メンテナーはふだん 1 日以内に返信
-
lane:discover
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
SPARDiffData/differential-data-collection#33 ·
メンテナーはふだん 1 日以内に返信