async-blocking-runtime
async-blocking-runtime
这个示例用于复现博客里提到的典型误区:在 async 任务中直接执行阻塞操作,导致运行时线程被占住,影响其他任务调度。
关联文章:_posts/2026-04-30-rust-async-await-future-poll-tokio-runtime.md
运行方式
在本目录下执行:
cargo run -- bad
或:
cargo run -- good
两种模式说明
bad- 在 async 任务中直接调用
std::thread::sleep - 这会阻塞 Tokio worker 线程(示例配置为 1 个 worker),导致 heartbeat 长时间停顿
- 在 async 任务中直接调用
good- 使用
tokio::time::sleep - 等待期间不阻塞 worker 线程,heartbeat 可持续输出
- 使用
预期观察点
bad模式下:worker-*结束时间更接近串行heartbeat会明显“卡住”
good模式下:worker-*结束时间更接近并发heartbeat持续输出
测试用例(demo)
在本目录执行:
cargo test -- --nocapture
当前包含一个测试:blocking_sleep_in_async_reduces_runtime_progress
- 对比
bad与good两种模式的总耗时 - 对比 heartbeat tick 数量
- 用于演示“在 async 任务里直接阻塞线程会影响运行时调度”
- 测试会打印一段对比报告,方便直接阅读学习