#async-executor #executor #non-blocking #async #future

puteketeke

基于smol构建的异步运行时

5个版本

0.0.5 2024年2月23日
0.0.4 2024年2月11日
0.0.3 2023年11月28日
0.0.2 2023年11月22日
0.0.1 2023年11月19日

#627异步

Download history 29/week @ 2024-04-22 17/week @ 2024-04-29 12/week @ 2024-05-06 26/week @ 2024-05-13 49/week @ 2024-05-20 34/week @ 2024-05-27 31/week @ 2024-06-03 28/week @ 2024-06-10 23/week @ 2024-06-17 15/week @ 2024-06-24 33/week @ 2024-07-29 21/week @ 2024-08-05

54 每月下载量

MIT/Apache

42KB
769

Build Status codecov Lines of Code

Pūteketeke: Rust异步运行时

此crate基于smol构建,以提供更直观和完整的异步Rust程序运行时。这就像是您从smol开始,添加了一个线程池并使API更易于使用后得到的结果。

以下是一个“Hello World”程序。

// Create an executor with four threads.
use puteketeke::{AsyncTask, Executor};
use futures_lite::future;

let executor = Executor::new(4);

let task = executor
    .create_task(async { println!("Hello world") })
    .unwrap();

// Note that we need to start the task, otherwise it will never run.
executor.start_task(&task);
future::block_on(task);

有关使用信息,请查看文档

目的 — 或者;我们是否需要另一个运行时?

对我来说,对这个问题的答案是显然的,是的。对p8e的需求源于我想要为我的编程语言dwarf添加异步支持。我已经有了这个语言,我只想“附加”异步 — 而不是使所有内容都异步。结果证明这是一次大量的试错,并且比我想知道的更多地了解了异步Rust。鉴于这种情况,我认为其他人也可能从中受益。因此,我将代码分离出来成为一个crate。

主要来说,此crate旨在供那些希望在代码中添加一些异步功能但不希望完全承诺的人使用。此crate不需要将main包装在'async fn'中,并且它确实使处理futures变得非常简单。值得注意的功能包括

  • 一个RAII executor,由线程池支持,在释放时自行清理
  • 一个开始时暂停的任务,可以自由传递
  • 能够创建在之上执行任务的隔离工作者
  • 易于使用且简单的API
  • 并行计时器

实际上,我在dwarf中除了需要一个executor之外,最大的需求就是能够入队一个暂停的任务。这并不是很难解释为什么。考虑以下dwarf代码

async fn main() -> Future<()> {
    let future = async {
        print(42);
    };
    print("The answer to life the universe and everything is: ");
    future.await;
}

如你所猜,这会打印"The answer to life the universe and everything is: 42"。

解释器正在处理语句和表达式。当遇到块表达式

async {
    print(42);
}

处理完成后,我们不想立即开始执行未来,否则句子会出错。因此,我们需要保留那个未来,并且仅在它被等待之后,在打印表达式之后才开始执行。此外,我们还需要在处理下一个语句时,能够将那个未来传递给解释器。

许可证

Pūteketeke 是在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发的。

详情请见 LICENSE-APACHELICENSE-MIT

依赖项

~3–12MB
~139K SLoC