欢迎大家来到IT世界,在知识的湖畔探索吧!
这两者都是让当前线程/任务暂停一段时间,但它们工作方式完全不同。
✅ 总体区别:同步阻塞 vs 异步挂起
|
对比项 |
std::thread::sleep |
tokio::time::sleep().await |
|
属于哪个模块 |
std::thread |
tokio::time |
|
是否异步 |
❌ 同步阻塞 |
✅ 异步挂起,不阻塞线程 |
|
会不会阻塞线程 |
✅ 会阻塞当前线程 |
❌ 不阻塞线程,只挂起当前 async 任务 |
|
适用场景 |
普通同步程序 / 不使用 Tokio 的代码 |
在 Tokio 异步环境中(#[tokio::main]) |
|
精度和调度 |
操作系统调度(实际等待) |
由 Tokio 的任务调度器精确控制 |
|
是否能被取消/超时控制 |
❌ 不能被中断 |
✅ 可被 .timeout() 等取消 |
使用场景说明:
✅ 1. std::thread::sleep 使用示例:
use std::{thread, time::Duration}; fn main() { println!("sleeping..."); thread::sleep(Duration::from_secs(2)); // 阻塞线程 2 秒 println!("done."); }
欢迎大家来到IT世界,在知识的湖畔探索吧!
适合写在普通函数里,不能在 async 函数中用,否则会阻塞整个 Tokio runtime!
✅ 2. tokio::time::sleep 使用示例:
欢迎大家来到IT世界,在知识的湖畔探索吧!use tokio::time::{sleep, Duration}; #[tokio::main] async fn main() { println!("async sleeping..."); sleep(Duration::from_secs(2)).await; // 异步挂起 2 秒 println!("done."); }
只能用于 async 函数中,而且不会阻塞线程,Tokio 会把这段时间让给其他任务去执行(高效)。
⚠️ 使用注意
在 #[tokio::main] async fn main() 这样的异步上下文中:
- ❌ 不要使用 std::thread::sleep —— 会阻塞整个异步线程池,降低性能。
- ✅ 用 tokio::time::sleep().await 才能真正异步。
✅ 总结
|
场景 |
推荐使用 |
|
同步代码 / 非 async 函数 |
std::thread::sleep |
|
异步代码 / async 函数中 |
tokio::time::sleep().await |
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/138372.html