Parallel mode: 'No status file found' INTERNAL ERROR when loading a plugin holds the GIL for more than 3 s
まだ誰も着手していません。
評価
調査の方向性
Start with mypy/build.py, especially WorkerClient.connect(), build(), and build_inner(), then run the supplied ctypes plugin reproduction with -n 2. Trace the coordinator’s status-file deadline and the worker connection timeout; done means the slow-plugin case no longer produces the reported INTERNAL ERROR or loses an already-written status file.
索引モデルが issue の本文から書いたものです。
説明
Crash Report
With -n 2, mypy fails with "Failed to establish connection with worker: No status file found" although both workers started and wrote their status files in time. build() starts the workers and their connect() threads before build_inner() loads plugins. If a plugin import holds the GIL past the 3 s WORKER_START_TIMEOUT, the threads cannot poll, and when they next run the loop has timed out and exits without reading the status file again.
We hit this in PyVista, whose plugin imports VTK, on the first run in a new environment. On macOS the first dlopen() of a newly installed binary waits for an XProtect scan while holding the GIL, so that import blocks for 12 to 17 s (0.12 s afterwards). In one failing run the workers wrote their status files 1.2 s after spawn, and the coordinator was still in the plugin import 12 s later.
Reading the status file once more after the deadline fixes the ctypes reproduction below (tested on master):
--- a/mypy/build.py
+++ b/mypy/build.py
@@ -289,11 +289,13 @@ class WorkerClient:
def connect(self) -> None:
end_time = time.time() + WORKER_START_TIMEOUT
last_exception: Exception | None = None
- while time.time() < end_time:
+ while True:
try:
data = read_status(self.status_file)
except BadStatus as exc:
last_exception = exc
+ if time.time() >= end_time:
+ break
time.sleep(WORKER_START_INTERVAL)
continue
try:
It does not reliably fix the VTK case: when the stall outlasts the worker's own 10 s WORKER_CONNECTION_TIMEOUT, the worker has stopped waiting and the run fails with Failed to establish connection with worker: [Errno 2] No such file or directory instead. Starting the workers after plugins are loaded may avoid both. It would also help to report this as an ordinary error rather than an INTERNAL ERROR. #21969 and #21974 look similar but have different causes.
Traceback
error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 2.3.1
note: use --pdb to drop into pdb
Failed to establish connection with worker: No status file found
Failed to establish connection with worker: No status file found
Traceback (most recent call last):
File ".../venv/lib/python3.14/site-packages/mypy/__main__.py", line 16, in console_entry
main()
~~~~^^
File "mypy/main.py", line 154, in main
File "mypy/main.py", line 244, in run_build
File "mypy/build.py", line 422, in build
File "mypy/build.py", line 537, in build_inner
File "mypy/build.py", line 4145, in dispatch
OSError: Cannot connect to build worker(s): 0, 1
To Reproduce
A plugin that holds the GIL for 4 s. This fails on every run, with 2.3.1 and with master; sleep(2) passes.
mkdir pkg && echo 'x: int = 1' > pkg/__init__.py
cat > gil_plugin.py <<'EOF'
import ctypes
from mypy.plugin import Plugin
# Hold the GIL for 4 s, as a slow import of a compiled extension can.
ctypes.PyDLL(None).sleep(4)
def plugin(version: str) -> type[Plugin]:
return Plugin
EOF
printf '[mypy]\nplugins = gil_plugin.py\n' > mypy.ini
mypy -n 2 --show-traceback pkg
On macOS, import vtkmodules.vtkRenderingCore in place of the ctypes lines, in a new venv with mypy==2.3.1 vtk==9.7.0, fails on the first run and passes on the second. Precompiling bytecode (UV_COMPILE_BYTECODE=1) makes no difference.
Your Environment
- Mypy version used: 2.3.1 (compiled: yes), and master at b645e069c (from git, not compiled)
- Mypy command-line flags:
-n 2 --show-traceback - Mypy configuration options from
mypy.ini(and other config files):plugins = gil_plugin.py - Python version used: 3.14.0 and 3.14.5
- Operating system and version: macOS 26.6.2, arm64 (the
ctypesreproduction should not be macOS-specific, but I only ran it there)
Investigated and drafted with Claude Code (Claude Opus 5.5).
- 主要言語
- Python
- スター
- 20.6k
- フォーク
- 3.3k
- 平均マージ
- 1日 12時間
- マージ済み PR(30日)
- 58
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
python/mypy のほかの issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
bug topic-configuration topic-error-reporting
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
bug topic-attrs
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
似ている issue
-
essnmx good first issue
難易度 1/5 1時間未満 初心者へのやさしさ 95/100
-
[Feature] 奇物选择添加优先级 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
syfoud/Simulated_Scepter#174 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
Giskard-AI/giskard-oss#2840 · コメント 1 件 ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success オープンarea: repo bug perceived difficulty: 2
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
yeti-platform/yeti#1380 ·