Skip to content

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