#任务 #future #executor #spawn #task-queue

无 std async-task

构建执行器的任务抽象

24 个稳定版本 (4 个主要版本)

4.7.1 2024年4月27日
4.7.0 2024年1月4日
4.6.0 2023年12月17日
4.5.0 2023年10月18日
0.1.0 2019年5月7日

#9异步

Download history 490230/week @ 2024-05-02 490109/week @ 2024-05-09 506796/week @ 2024-05-16 498434/week @ 2024-05-23 527544/week @ 2024-05-30 511838/week @ 2024-06-06 516051/week @ 2024-06-13 502832/week @ 2024-06-20 523769/week @ 2024-06-27 484547/week @ 2024-07-04 522650/week @ 2024-07-11 543698/week @ 2024-07-18 551843/week @ 2024-07-25 550353/week @ 2024-08-01 605942/week @ 2024-08-08 465383/week @ 2024-08-15

2,273,317 每月下载量
用于 5,023 个 crate (51 个直接使用)

Apache-2.0 OR MIT

100KB
1.5K SLoC

async-task

Build License Cargo Documentation

构建执行器的任务抽象。

要将 future 启动到执行器上,我们首先需要在堆上为其分配空间并保持一些与其关联的状态。该状态指示 future 是否准备好轮询、等待唤醒或完成。这种具有状态的 future 称为 任务

所有执行器都有一个队列,用于持有计划中的任务

let (sender, receiver) = flume::unbounded();

可以使用 spawn()spawn_local()spawn_unchecked() 创建任务,这些函数返回一个 Runnable 和一个 Task

// A future that will be spawned.
let future = async { 1 + 2 };

// A function that schedules the task when it gets woken up.
let schedule = move |runnable| sender.send(runnable).unwrap();

// Construct a task.
let (runnable, task) = async_task::spawn(future, schedule);

// Push the task into the queue by invoking its schedule function.
runnable.schedule();

Runnable 用于轮询任务的 future,而 Task 用于等待其输出。

最后,我们需要一个循环,从队列中取出计划中的任务并运行它们

for runnable in receiver {
    runnable.run();
}

方法 run() 轮询任务的 future 一次。然后,Runnable 消失,只有在它的 Waker 唤醒任务并重新安排它再次运行时才会再次出现。

许可证

根据以下任一许可证授权:

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按上述方式双许可,无需任何额外的条款或条件。

依赖关系

~215KB