2个稳定版本
4.1.1 | 2021年1月26日 |
---|
#1441 in 异步
81KB
1K SLoC
async-task-ffi
这是对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 License,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在作品中的贡献,均应按上述方式双重许可,而不附加任何额外条款或条件。