#task #executor #future #task-queue #spawn #ffi

no-std async-task-ffi

构建执行器时的任务抽象

2个稳定版本

4.1.1 2021年1月26日

#1441 in 异步

Apache-2.0/MIT

81KB
1K SLoC

async-task-ffi

Build License Cargo Documentation

这是对async-task的分支,增加了对基于ffi的执行器有用的功能。

构建执行器时的任务抽象。

要将future派生到执行器上,我们首先需要在堆上为其分配空间,并附加一些状态。这种状态表示future是否已准备好轮询、等待唤醒或已完成。这种具有状态的future被称为任务

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

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

任务可以使用spawn()spawn_local()spawn_unchecked()或它们的_with变体创建,这些变体返回一个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_ffi::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许可证定义,您提交的任何有意包含在作品中的贡献,均应按上述方式双重许可,而不附加任何额外条款或条件。

无运行时依赖