10个版本 (5个重大更新)

0.9.1 2023年12月4日
0.9.0 2023年12月3日
0.8.1 2023年10月25日
0.7.0 2023年10月5日
0.4.1 2022年10月20日

#758 in 并发

Download history 75/week @ 2024-04-05 27/week @ 2024-04-12 4/week @ 2024-04-19 3/week @ 2024-05-03 25/week @ 2024-05-10 15/week @ 2024-05-17 22/week @ 2024-05-24 30/week @ 2024-05-31 34/week @ 2024-06-07 36/week @ 2024-06-14 33/week @ 2024-06-21 45/week @ 2024-06-28 10/week @ 2024-07-05 249/week @ 2024-07-12 22/week @ 2024-07-19

每月下载量 327
用于 rust-box

MIT/Apache

115KB
3K SLoC

任务执行队列

英文 | 简体中文

任务执行队列 一个任务执行队列。可以限制并发任务的数量,并可以控制相同类型任务的执行顺序。通常,可以使用Tokio或async-std直接执行异步任务;然而,在某些特殊业务场景中,当我们需要批量执行任务并控制任务并发数时,直接使用spawn()很容易导致负载过高和资源(如CPU或内存)耗尽;此Crate旨在解决此类问题。

特性

  • 执行任务;
  • 执行任务并返回结果;
  • 限制并发任务数;
  • 任务队列;
  • 相同类型任务的顺序执行;
  • 支持本地任务;

计划

示例

  • 快速开始
fn main() {
    use async_std::task::spawn;
    use rust_box::task_exec_queue::{init_default, default, SpawnDefaultExt};

    let task_runner = init_default();
    let root_fut = async move {
        spawn(async {
            //start executor
            task_runner.await;
        });

        //execute task ...
        let _ = async {
            println!("hello world!");
        }.spawn().await;

        default().flush().await;
    };
    async_std::task::block_on(root_fut);
}

  • 执行并返回结果
fn main() {
    use async_std::task::spawn;
    use rust_box::task_exec_queue::{Builder, SpawnExt};
    let (exec, task_runner) = Builder::default().workers(10).queue_max(100).build();
    let root_fut = async move {
        spawn(async {
            //start executor
            task_runner.await;
        });

        //execute task and return result...
        let res = async {
            "hello world!"
        }.spawn(&exec).result().await;
        println!("result: {:?}", res.ok());

        exec.flush().await;
    };
    async_std::task::block_on(root_fut);
}

  • 顺序执行
fn main() {
    use async_std::task::spawn;
    use rust_box::task_exec_queue::{Builder, SpawnExt};

    let (exec, task_runner) =
        Builder::default().workers(10).queue_max(100).group().build::<&str>();
    let root_fut = async move {
        spawn(async {
            //start executor
            task_runner.await;
        });

        //execute task ...
        let _res = async move {
            println!("hello world!");
        }.spawn(&exec).group("g1").await;

        let res = async move {
            "hello world!"
        }.spawn(&exec).group("g1").result().await;
        println!("result: {:?}", res.ok());

        exec.flush().await;
        println!("exec.actives: {}, waitings: {}, completeds: {}", exec.active_count(), exec.waiting_count(), exec.completed_count());
    };
    async_std::task::block_on(root_fut);
}

更多示例

依赖项

~3.5–9.5MB
~83K SLoC