7 个版本

0.3.3 2022年10月6日
0.3.2 2022年10月4日
0.3.0 2022年9月29日
0.2.1 2022年9月20日
0.1.1 2022年9月7日

#2035 in 异步

MIT/Apache

80KB
2.5K SLoC

任务执行器

英语 | 简体中文

任务执行器 控制并行执行数量的任务执行器。通常,可以使用 Tokio 或 async-std 直接执行普通异步任务;然而,在某些特殊业务场景中,我们需要批量执行某种类型的任务,并控制此类任务的并发任务数量。直接使用 spawn() 容易导致负载过重和资源(如 CPU 或内存)耗尽。此执行器正是为解决此类问题而开发的。

特性

  • 执行任务;
  • 执行任务并返回结果;
  • 控制并发执行的任务数量;
  • 支持任务队列;
  • 相同分组的任务顺序执行;
  • 支持本地任务

计划

示例

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

    let task_runner = init_default();
    let global = async move{
        spawn(async {
            //start executor
            task_runner.await;
        });
        //execute future ...
        let _ = async {
            println!("hello world!");
        }.spawn().await;

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

  • 执行并返回结果
fn main() {
    use async_std::task::spawn;
    use rust_box::task_executor::{Builder, SpawnExt};
    let (exec, task_runner) = Builder::default().workers(10).queue_max(100).build();
    let global = async move{
        spawn(async {
            //start executor
            task_runner.await;
        });
        //execute future and return result...
        let res = async {
            "hello world!"
        }.spawn(&exec).result().await;
        println!("return result: {:?}", res.ok());

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

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

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

        //execute future ...
        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(global);
}

更多示例

依赖关系

~3–9MB
~72K SLoC