Rust Tokio 完整工程:有界任务、保序与失败收拢 · 输入与依赖至手工预期与恢复
前置:任务所有权。项目位于 examples/rust/p2-async-runtime,读取文件的每一行,真实计算 u64 checked sum;不需要账号、服务或端口。本次示例未执行,未运行 Cargo/Rust 编译、测试或格式化,也未安装依赖。未来读者可按 README 自跑核验;静态解析不能证明 Rust 类型正确或运行行为通过。
Rust Tokio 完整工程:有界任务、保序与失败收拢
前置:任务所有权。项目位于 examples/rust/p2-async-runtime,读取文件的每一行,真实计算 u64 checked sum;不需要账号、服务或端口。本次示例未执行,未运行 Cargo/Rust 编译、测试或格式化,也未安装依赖。未来读者可按 README 自跑核验;静态解析不能证明 Rust 类型正确或运行行为通过。
输入与依赖
Rust异步工程输入契约定义每行任务与失败分层:UTF-8 每行空白分隔 u64,空行结果0,空文件无输出;CRLF 可用。单行 ERR 解析为故意拒绝的任务,非法数字则在提交前拒绝。checked_add 检测溢出,不依靠 debug/release 模式差异决定业务正确性。
固定 Tokio =1.48.0,edition 2021,声明 rust-version 1.71;MSRV 对齐依赖声明,不代表已经最低版本编译。rt-multi-thread 提供两线程 Runtime,macros 为测试属性服务,sync 为 oneshot 取消测试服务;无网络、fs、time 特性。同步 fs::read_to_string 在进入 Runtime 前完成,输入与结果 O(n) 驻内存;这是有限批次实验,不是恒定内存流处理器。未生成 Cargo.lock,不伪造依赖解析结果。具体依赖见下方同源文件。
有界提交与保序
Rust JoinSet有界保序依靠容量限制与输入序号:仅当 JoinSet.len 小于 limit 时提交下一个任务,回收后才补充。即使某任务已完成但未回收,也仍占一个容量槽。每任务每64项计算后 yield,结果不是 sleep 后伪造,也不依赖定时器或网络状态。
完成顺序由调度决定,join_next 返回完成的任务,不承诺输入顺序。每次提交携带 index,成功回写 results[index],全部成功后 CLI 才统一按序打印。limit=0 先拒绝;limit 大于任务数不会凭空生成任务。worker_threads(2) 与 limit 分别限制线程数和跟踪任务数,两者不是同一指标。JoinSet 1.48.0 是接口依据。
失败收拢与清理
Rust异步失败收拢遵循停止补充与等待退出:一旦观察业务 Err 或 JoinError,调度器不再读取 pending 任务,abort_all 请求其他任务取消,然后 join_next 直到集合为空,最后返回 Err。已完成但尚未观察的任务可能已产生结果;本工程无外部写入,整体失败时丢弃这些部分结果即可。
Metrics 的 Active guard 进入计算时递增、Drop 时递减;返回后 active=0 用来检验清理。oneshot 取消测试先确认任务已经进入,再 abort 和 join,避免 sleep 猜时序。它验证的是显式等待到返回的协议;上层直接取消 analyze 不享有同步等完析构保证。abort 对已启动 spawn_blocking 的同步代码不具备停止能力,所以没有把同步阻塞套一层 async 冒充可取消。
手工预期与恢复
Rust异步手工预期与恢复以整批结果为单位:normal.txt 依次输出6、7、4并退出0;reject.txt 报 rejected job,overflow.txt 报 sum overflow,invalid.txt 报 invalid u64,所有失败向 stderr 输出错误、退出1且无部分 stdout。缺文件和零上限也应失败;系统文件错误文本不作跨平台逐字承诺。
未来自跑先准备工具链和缓存依赖,再在工程目录按 README 执行;offline 缺缓存会失败,不能据此认定源码有错。没有临时业务资源或服务需要回滚,修正输入后重跑。构建目录 target 是自跑生成物,可确认目录后自行清理;锁文件应审阅提交。测试只检查输出、峰值不超过额度和返回后无活跃任务,不断言固定完成顺序或性能收益。
继续阅读
- 排错
- 排错
- 排错