#thread-pool #async-io #file-io #async #stdin #file #stdio

blocking

异步程序中隔离阻塞 I/O 的线程池

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 异步

Download history 445890/week @ 2024-05-03 484123/week @ 2024-05-10 473088/week @ 2024-05-17 478034/week @ 2024-05-24 502546/week @ 2024-05-31 493560/week @ 2024-06-07 478795/week @ 2024-06-14 489783/week @ 2024-06-21 468452/week @ 2024-06-28 485796/week @ 2024-07-05 505334/week @ 2024-07-12 527639/week @ 2024-07-19 527653/week @ 2024-07-26 530761/week @ 2024-08-02 571244/week @ 2024-08-09 463635/week @ 2024-08-16

每月 2,191,680 次下载
用于 4,080 crates(65 个直接使用)

Apache-2.0 OR MIT

43KB
523

blocking

Build License Cargo Documentation

异步程序中隔离阻塞 I/O 的线程池。

有时无法避免阻塞 I/O。考虑文件或 stdin,在现代操作系统上,它们对异步的支持较弱。尽管 IOCPAIOio_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许可证定义,您有意提交以包含在作品中的任何贡献,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1MB
~14K SLoC