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