06 · 第一个 1000 节点应用¶
目标:构建 1000 个任务的图并一次触发,理解吞吐与选择性执行发生的位置。
代码要点¶
for i in range(N):
def f(x, _i=i): # 闭包捕获 i,每个任务写独立字段
return {f"v{_i}": x.get("value", 0) + _i}
b.task(f"t{i}", kind="pure", fn=f).on("run", f"t{i}")
一次 invoke("run", {...}) 并行路由 1000 个任务,状态合并为 1000 个字段。
选择性执行在哪一层?¶
重要事实(避免过度承诺):
- 同一 run 内:输入指纹相同的 pure 任务被跳过(
fingerprint_unchanged) —— 见差分基准的 wide 场景(1000 节点改 1 字段,只执行 1 个) - computed:按读集失效,只重算被改动的派生值(见 03)
- 跨 invoke:每次 RUN 是新的调度实例,重复相同事件不自动去重
实测(本机,见 code/06_1000_nodes.py 输出):1000 节点一次 invoke
约 0.9 s(含 wire 交互);节点数增加是线性而非组合爆炸。
运行¶
uv run --directory python/reactivegraph python docs/tutorials/code/06_1000_nodes.py
进阶¶
- 想看"超越全量重跑"的量化证据:跑差分基准
uv run --directory benchmarks/differential python run_differential.py --refresh