39 个版本

0.14.1 2023 年 8 月 9 日
0.14.0 2023 年 7 月 21 日
0.13.1 2023 年 5 月 5 日
0.12.1 2022 年 11 月 29 日
0.2.0 2020 年 11 月 7 日

#208网络编程

Download history 77/week @ 2024-04-22 41/week @ 2024-04-29 26/week @ 2024-05-06 59/week @ 2024-05-13 82/week @ 2024-05-20 43/week @ 2024-05-27 51/week @ 2024-06-03 75/week @ 2024-06-10 77/week @ 2024-06-17 60/week @ 2024-06-24 164/week @ 2024-07-01 14/week @ 2024-07-08 48/week @ 2024-07-15 30/week @ 2024-07-22 101/week @ 2024-07-29 32/week @ 2024-08-05

213 每月下载量
17 包中使用 (直接使用 15 个)

Apache-2.0/MIT

355KB
5.5K SLoC

此库允许您构建在 Lunatic 上运行的 Rust 应用程序。

文档 | 加入我们的 Discord 社区!

为什么选择在 Lunatic 上运行?

Lunatic 为所有编译为 WebAssembly 的编程语言提供了一个类似 Erlang 的运行时。它专注于创建超级轻量级进程,也称为绿色线程或其他运行时中的 go-routines。Lunatic 进程创建快速,内存占用小,调度开销低。它们是为 大规模并发 而设计的。

Lunatic 进程彼此完全隔离,它们有自己堆栈、堆甚至系统调用。如果一个进程失败,它不会影响系统的其余部分。这使得您可以创建强大且容错的应用程序。

在 lunatic 上运行的所有进程都由一个 work stealing 异步执行器进行抢占式调度和执行。这使您可以编写简单的 阻塞 代码,但运行时将确保在等待 I/O 时不会阻塞线程。

要了解更多关于 lunatic 架构的信息,请查看 运行时仓库。它用 Rust 编写 :)

示例

创建一个新的进程就像定义一个入口函数一样简单。

use lunatic::{spawn_link, Mailbox};

#[lunatic::main]
fn main(_: Mailbox<()>) {
    let child = spawn_link!(@task || {
        // This closure gets a new heap and stack to
        // execute on, and can't access the memory of
        // the parent process.
        println!("Hi! I'm a process.");
    });
    // Wait for child to finish
    let _ignore = child.result();
}

更多示例请查看 这里

设置

要运行示例,您首先需要通过 此仓库 中的安装步骤下载 lunatic 运行时。运行时只是一个可执行文件,可在 Windows、macOS 和 Linux 上运行。如果您已经安装了 Rust,可以使用以下命令获取它

cargo install lunatic-runtime

Lunatic 应用程序需要编译成 WebAssembly,然后才能由运行时执行。Rust 对 WebAssembly 有很好的支持,你只需将 --target=wasm32-wasi 标志传递给 cargo,就可以构建一个兼容 Lunatic 的应用程序,例如

# Add the WebAssembly target
rustup target add wasm32-wasi
# Build the app
cargo build --release --target=wasm32-wasi

这将在你项目的 target/wasm32-wasi/release/ 文件夹中生成一个 .wasm 文件。现在你可以通过将生成的 .wasm 文件传递给 Lunatic 来运行你的应用程序,例如

lunatic target/wasm32-wasi/release/<name>.wasm

更好的开发者体验

为了简化使用 cargo 开发、测试和运行 Lunatic 应用程序,你可以在项目中添加一个 .cargo/config.toml 文件,内容如下

[build]
target = "wasm32-wasi"

[target.wasm32-wasi]
runner = "lunatic"

现在你可以使用你熟悉的命令,例如 cargo runcargo test,cargo 将自动将你的项目构建为 WebAssembly 模块并在 lunatic 中运行。

测试

Lunatic 提供了一个宏 #[lunatic::test],可以将你的测试转换为进程。查看 tests 文件夹以获取示例。

支持的 Lunatic 功能

一些功能通过 Rust 的标准库直接支持,例如文件系统访问(std::fs::File)。其他功能特定于 Lunatic,例如进程创建(lunatic::Process)。

一些在 Rust 的标准库中通常可用的功能(如 TCP,例如 std::net::TcpListener)尚未由 WASI 标准化。因此,我们通过 这个库 提供了它们(例如 lunatic::net::TcpListener)。一旦 WASI 支持这些功能,你将能够直接使用标准库。

目前可用功能

  • 进程创建(使用此库)
  • 精细的进程权限(使用此库)
  • 进程间消息传递(使用此库)
  • TCP 网络通信(使用此库)
  • 文件系统访问
  • 环境变量
  • 分布式 Lunatic

注意:一些库目前在 wasm32-wasi 目标下无法编译,也不能在 Lunatic 应用程序中使用。这包括 Rust 的大多数 async 生态系统。

依赖

~2-22MB
~302K SLoC