#lunatic #process #applications #run #spawning #mailbox #helper

lunatic-twitchax-patch

用于构建在 lunatic 上运行的 Rust 应用程序的辅助库

1 个不稳定版本

0.14.1 2024年1月7日

#83 in 电子邮件

每月下载量 46 次
用于 4 个 crates(直接使用 3 个)

Apache-2.0/MIT

355KB
6K 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 有很好的支持,只需通过向 cargo 传递 --target=wasm32-wasi 标志,就可以构建兼容 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 文件夹以获取示例。

支持的特征

一些特性直接通过 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–24MB
~339K SLoC