30 个版本 (12 个稳定版)
1.6.1 | 2024 年 5 月 26 日 |
---|---|
1.5.1 | 2023 年 11 月 13 日 |
1.3.1 | 2023 年 4 月 7 日 |
1.3.0 | 2022 年 11 月 26 日 |
0.1.0 | 2019 年 6 月 15 日 |
#5 in 异步
每月 2,191,680 次下载
用于 4,080 个 crates(65 个直接使用)
43KB
523 行
blocking
异步程序中隔离阻塞 I/O 的线程池。
有时无法避免阻塞 I/O。考虑文件或 stdin,在现代操作系统上,它们对异步的支持较弱。尽管 IOCP、AIO 和 io_uring 是可能的解决方案,但它们并不总是可用或理想。
由于在 futures 中不允许阻塞,我们必须将阻塞 I/O 移动到由该 crate 提供的特殊线程池。该池根据当前运行的 I/O 作业数量动态地创建和停止线程。
请注意,活动线程的数量有限。一旦达到此限制,运行中的作业必须完成,其他作业才有机会运行。当线程空闲时,它将等待下一个作业或经过一定超时后关闭。
默认线程数(设置为 500)可以通过设置 BLOCKING_MAX_THREADS 环境变量来更改,其值在 1 到 10000 之间。
示例
读取文件内容
use blocking::unblock;
use std::fs;
let contents = unblock(|| fs::read_to_string("file.txt")).await?;
println!("{}", contents);
读取文件并将内容管道到 stdout
use blocking::{unblock, Unblock};
use futures_lite::io;
use std::fs::File;
let input = unblock(|| File::open("file.txt")).await?;
let input = Unblock::new(input);
let mut output = Unblock::new(std::io::stdout());
io::copy(input, &mut output).await?;
遍历目录内容
use blocking::Unblock;
use futures_lite::prelude::*;
use std::fs;
let mut dir = Unblock::new(fs::read_dir(".")?);
while let Some(item) = dir.next().await {
println!("{}", item?.file_name().to_string_lossy());
}
启动进程
use blocking::unblock;
use std::process::Command;
let out = unblock(|| Command::new("dir").output()).await?;
许可证
许可协议为以下之一
- Apache 许可证 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~1MB
~14K SLoC