Repository navigation
Commit 73e0e7d
fix: 让 example_runner CI 回绿——修 stdin 隔离、Queue 死锁与 class 笔误,67 个教学片段加 skip 标注
这个 workflow 自 2026-04-28 加入起跑过 16 次、一次没绿过,69 个「失败」里
只有 2 个是真问题,其余全是本来就不该当独立程序跑的教学片段。一直红着等于
没有 CI——真回归会被淹没,本次就是为了确认前一个 commit 有没有引入新失败,
才不得不逐块做差集,两个真 bug 由此第一次单独露出来。
工具缺陷(长期红的根因):
- subprocess.run 没传 stdin,含 input() 的块在有 stdin 的环境里等到超时、
在没有的环境里立刻抛 EOFError,同一份代码两种结果。CI 各版本失败数长期
在 69~72 之间飘就是这个原因,不是内容有四种状态。钉死为 DEVNULL。
- 超时 10s → 30s:并发示例本地实测就要 4~5 秒(python13/2.md 两块各 5.04s、
python13/3.md 一块 4.07s),CI 机器更慢必然偶发超时。
真 bug 两处:
- python13/2.md 的 Queue 生产者消费者示例死锁:写线程放完 3 个值就结束,
读线程 while isRead 永远为真、q.get(True) 永久阻塞,读者复制到本地跑必须
强制中断。改为写完放 None 哨兵、读到哨兵 break,并删掉那个永远为真的
isRead 全局变量。这段代码 2019-10-14 就在了,因为输出完全正确、只是不会
自己退出,手动验证看不出来。python-lab 有同源内容,已同步修改。
- codeSpecification_third.md 的 `Class FooBar:` 写成大写 C,读者复制即
SyntaxError。两仓 grep 确认 python-lab 无同样问题。
67 处 <!-- skip-ci --> 标注,涉及 34 个文件:语法示意(for x in sequence:)、
占位符、假模块名(import decoder / foo / bar)、依赖前文的连续片段、故意演示
报错的例子(如 python15 闭包章节的 UnboundLocalError)。与 python17-27 既有的
131 处标注同样处理——此前 skip 标注只覆盖 2026 新写的章节,python0-16 与
codeSpecification 从未处理过,这是 CI 长期红的结构性原因。
验证:本地 python3 全量跑 691 块,改前「跳过 131;失败 69」exit 1,
改后「跳过 198;失败 0」exit 0;Queue 示例改后连跑 5 次均 0.02 秒正常退出、
输出 6 行。
已知残留:python13/2.md 第 339 行的 Event 示例有竞态(if event.isSet() 与
event.clear() 之间非原子,两个线程可能都进 wait() 而只有一个 set() 唤醒),
本地连跑 20 次未触发,但 8-31 那次 CI 的 3.11 与 3.13 各失败过一次,故 CI
仍有小概率偶发红。未在本次范围内处理。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKcB6SFyeRo9UPJL99QvkC1 parent c91a9a0 commit 73e0e7d
35 files changed
Lines changed: 78 additions & 6 deletions
File tree
- Article
- PythonBasis
- python11
- python12
- python13
- python14
- python15
- python2
- python4
- python5
- python6
- python7
- python8
- python9
- codeSpecification
- tools
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| |||
97 | 98 | | |
98 | 99 | | |
99 | 100 | | |
| 101 | + | |
100 | 102 | | |
101 | 103 | | |
102 | 104 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| 75 | + | |
75 | 76 | | |
76 | 77 | | |
77 | 78 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
84 | 85 | | |
85 | 86 | | |
86 | 87 | | |
| 88 | + | |
87 | 89 | | |
88 | 90 | | |
89 | 91 | | |
| |||
115 | 117 | | |
116 | 118 | | |
117 | 119 | | |
| 120 | + | |
118 | 121 | | |
119 | 122 | | |
120 | 123 | | |
| |||
130 | 133 | | |
131 | 134 | | |
132 | 135 | | |
| 136 | + | |
133 | 137 | | |
134 | 138 | | |
135 | 139 | | |
| |||
177 | 181 | | |
178 | 182 | | |
179 | 183 | | |
| 184 | + | |
180 | 185 | | |
181 | 186 | | |
182 | 187 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| 18 | + | |
17 | 19 | | |
18 | 20 | | |
19 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
| 157 | + | |
157 | 158 | | |
158 | 159 | | |
159 | 160 | | |
160 | 161 | | |
161 | 162 | | |
162 | 163 | | |
| 164 | + | |
163 | 165 | | |
164 | 166 | | |
165 | 167 | | |
166 | 168 | | |
167 | 169 | | |
168 | 170 | | |
| 171 | + | |
169 | 172 | | |
170 | 173 | | |
171 | 174 | | |
| |||
174 | 177 | | |
175 | 178 | | |
176 | 179 | | |
| 180 | + | |
177 | 181 | | |
178 | 182 | | |
179 | 183 | | |
| |||
277 | 281 | | |
278 | 282 | | |
279 | 283 | | |
280 | | - | |
281 | | - | |
282 | 284 | | |
283 | 285 | | |
284 | 286 | | |
285 | 287 | | |
286 | 288 | | |
287 | 289 | | |
| 290 | + | |
288 | 291 | | |
289 | 292 | | |
290 | 293 | | |
291 | 294 | | |
292 | | - | |
| 295 | + | |
293 | 296 | | |
| 297 | + | |
| 298 | + | |
294 | 299 | | |
295 | 300 | | |
296 | 301 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| 76 | + | |
76 | 77 | | |
77 | 78 | | |
78 | 79 | | |
| |||
268 | 269 | | |
269 | 270 | | |
270 | 271 | | |
| 272 | + | |
271 | 273 | | |
272 | 274 | | |
273 | 275 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| 19 | + | |
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
0 commit comments