#并发 #任务 #构造 #子任务 #结构化 #创建 #等待

spawn_groups

用 Rust 编写的结构化并发构造,适用于 Rustaceans

1 个稳定版本

1.0.0 2023 年 9 月 24 日
0.1.1 2023 年 9 月 24 日
0.1.0 2023 年 9 月 24 日

#825 in 异步

自定义许可

57KB
1K SLoC

spawn_groups

rustc crate github license

简介

一个结构化并发构造,提供了一种创建和运行任意数量子任务的方法,可以在每个子任务执行完毕后立即等待其结果,取消所有正在运行中的子任务或等待所有子任务执行完毕。这受到了 Swift 语言中的 TaskGroup 的强烈影响。

安装

添加到您的代码中


$ cargo add spawn_groups

示例

use async_std::io::{self};
use async_std::net::{TcpListener, TcpStream};
use async_std::prelude::*;
use spawn_groups::{with_err_spawn_group, GetType, Priority};

async fn process(stream: TcpStream) -> io::Result<()> {
    println!("Accepted from local: {}", stream.local_addr()?);
    println!("Accepted from: {}", stream.peer_addr()?);
    let mut reader = stream.clone();
    let mut writer = stream;
    io::copy(&mut reader, &mut writer).await?;
    Ok(())
}

type Void = ();

#[async_std::main]
async fn main() -> io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;
    println!("Listening on {}", listener.local_addr()?);
    with_err_spawn_group(Void::TYPE, io::Error::TYPE, |mut group| async move {
        let mut incoming = listener.incoming();
        while let Some(stream) = incoming.next().await {
            let Ok(stream) = stream else {
                return Err(stream.expect_err("Expected an error"));
            };
            group.spawn_task(Priority::default(), async move { process(stream).await });
        }
        Ok(())
    })
    .await?;

    Ok(())
}

文档

有关此 rust crate 的更好文档,请访问 此处

依赖项

~1.1–7MB
~38K SLoC