1 个不稳定版本
0.14.1 | 2024年1月7日 |
---|
#83 in 电子邮件
每月下载量 46 次
用于 4 个 crates(直接使用 3 个)
355KB
6K SLoC
此库允许您构建在 Lunatic 上运行的 Rust 应用程序。
为什么在 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 run
、cargo 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