#tokio #process #stream #async-stream

tokio-process-stream

简单库,将tokio::process包装为tokio::stream

4个版本 (破坏性更新)

0.4.0 2023年4月2日
0.3.0 2022年6月1日
0.2.0 2022年1月29日
0.1.0 2022年1月5日

#860异步

Download history 1079/week @ 2024-03-14 1043/week @ 2024-03-21 762/week @ 2024-03-28 731/week @ 2024-04-04 969/week @ 2024-04-11 514/week @ 2024-04-18 492/week @ 2024-04-25 453/week @ 2024-05-02 353/week @ 2024-05-09 632/week @ 2024-05-16 431/week @ 2024-05-23 579/week @ 2024-05-30 478/week @ 2024-06-06 478/week @ 2024-06-13 311/week @ 2024-06-20 310/week @ 2024-06-27

1,670 每月下载量
4 crates 中使用

MIT 协议

15KB
172

CI coveralls crates.io doc.rs

tokio-process-stream

tokio-process-stream是一个简单库,将tokio::process包装为tokio::stream

当我们需要合并多个数据源并从单个入口点开始处理时,拥有进程流接口是有用的。

此库为futures::stream::Stream包装了tokio::process::Child。主要的结构是ProcessLineStream,它实现了该特性,每次产生一个Item枚举,每个包含底层进程的stdout(Item::Stdout)或stderr(Item::Stderr)中的一行,直到它退出。此时,流产生一个单独的Item::Done并结束。

示例用法

use tokio_process_stream::ProcessLineStream;
use tokio::process::Command;
use tokio_stream::StreamExt;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut sleep_cmd = Command::new("sleep");
    sleep_cmd.args(&["1"]);
    let ls_cmd = Command::new("ls");

    let sleep_procstream = ProcessLineStream::try_from(sleep_cmd)?;
    let ls_procstream = ProcessLineStream::try_from(ls_cmd)?;
    let mut procstream = sleep_procstream.merge(ls_procstream);

    while let Some(item) = procstream.next().await {
        println!("{:?}", item);
    }

    Ok(())
}

流式传输块

还可以使用ProcessChunkStream流式传输Item<Bytes>块。

use tokio_process_stream::{Item, ProcessChunkStream};
use tokio::process::Command;
use tokio_stream::StreamExt;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let mut procstream: ProcessChunkStream = Command::new("/bin/sh")
        .arg("-c")
        .arg(r#"printf "1/2"; sleep 0.1; printf "\r2/2 done\n""#)
        .try_into()?;

    while let Some(item) = procstream.next().await {
        println!("{:?}", item);
    }
    Ok(())
}

依赖项

~4–16MB
~152K SLoC