1 个不稳定版本
0.1.0 | 2024 年 7 月 30 日 |
---|
#679 在 异步
每月下载 117 次
8KB
97 行
swait
- 用于在 futures 上阻塞的简单实用工具
swait
库提供了一种实用工具,可以在给定的 future 准备就绪之前阻塞当前线程。这在异步操作需要与阻塞代码同步的场景中特别有用。名称 swait
来自 Rust 中的术语 await
,表示一个同步等待操作。swait
库起源于尝试通过 pull request 改善 pollster
crate 的性能,但最终没有合并。
特性
- 在 futures 上阻塞: 该库的主要特性是能够在 future 解析之前阻塞当前线程,从而在异步和同步代码之间提供一个无缝的桥梁。
- 高度优化: 它使用一种无锁算法,提供了一种高度优化的方法来同步等待 future。
- 无 unsafe
swait
简单且不使用任何 unsafe 代码。
安装
要将 swait
包含到您的项目中,请将以下内容添加到您的 Cargo.toml
[dependencies]
swait = "0.1.0"
然后,在项目中包含它
use swait::FutureExt;
使用
swait
主要提供的 API 是 FutureExt
trait,它通过 swait
方法扩展了 Rust 的 Future
trait 的功能。此方法阻塞当前线程,直到 future 解析。
示例
use swait::FutureExt;
async fn async_operation() -> i32 {
// Simulating an asynchronous operation
42
}
fn main() {
let result = async_operation().swait();
println!("The result is: {}", result);
}
在这个示例中,async_operation()
是一个返回 i32
的异步函数。通过在该函数上调用 swait()
,主线程将阻塞,直到结果可用,然后打印结果。
API 文档
FutureExt
Trait
swait
fn swait(self) -> Self::Output
where
Self: Sized;
此方法阻塞当前线程,直到 future 准备就绪,并返回 future 的输出。它为所有实现了 Future
trait 的类型实现。
swait
函数
pub fn swait<F: Future>(fut: F) -> F::Output
swait
函数是一个独立的函数,它接受一个 future 作为参数,并阻塞当前线程,直到 future 被解决。
内部实现
swait
的核心是围绕一个 Signal
结构构建的,该结构管理等待进程的状态。该 Signal
结构使用原子操作和线程的挂起/唤醒来高效地等待 future 完成。
Signal
结构
Signal
结构管理等待线程的状态,并提供等待和通知线程的方法。它使用一个 AtomicU8
来跟踪状态,该状态可以是 WAITING
、PARKED
或 NOTIFIED
。
wait
方法:此方法通过旋转、让步和挂起等方式阻塞线程。notify
方法:此方法如果线程处于挂起状态,则通知并唤醒线程。
许可
本项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。
贡献
欢迎贡献!请提交一个拉取请求或打开一个问题来讨论您的想法。