5 个版本
0.1.2 | 2023 年 3 月 6 日 |
---|---|
0.1.1 | 2023 年 3 月 6 日 |
0.1.0 | 2023 年 3 月 6 日 |
0.0.2 | 2022 年 9 月 6 日 |
0.0.1 | 2022 年 2 月 13 日 |
在 并发 中排名 #833
220KB
4.5K SLoC
Zestors
一个快速灵活的 Actor 框架,用于构建容错 Rust 应用程序,灵感来自 Erlang/OTP。
入门指南
Zestors 在 docs.rs 上有详细的文档,包括系统的大部分方面的指南和一个快速入门指南。这是推荐的开始方式。
注意
Zestors 还处于早期开发阶段,尽管 zestors 的核心部分已经稳定了一段时间,但从 handler
模块开始,预计会有很大的变化。与其私下完善一切,我更愿意将其发布出来,看看人们的想法。系统的某些部分已经进行了广泛的测试,但(很可能)存在错误。
如果您有任何反馈,无论是错误、不清楚的地方还是灵感/想法,我都非常愿意听取!
未来工作
- 完成
handler
模块的设计,并继续开发即将发布的supervision
crate。 - 继续进行单元测试和集成测试,并构建一些更大的示例。
- 开始设计和开发分布式环境。一切从零开始设计,考虑到分布性,但细节尚未完善。
最小示例
#[macro_use]
extern crate zestors;
use zestors::{messaging::RecvError, prelude::*};
// Let's define a single request ..
#[derive(Message, Envelope, Debug)]
#[request(u32)]
struct MyRequest {
param: String,
}
// .. and create a protocol that accepts this request.
#[protocol]
enum MyProtocol {
MyRequest(MyRequest),
String(String),
}
#[tokio::main]
async fn main() {
// Now we can spawn a simple actor ..
let (child, address) = spawn(|mut inbox: Inbox<MyProtocol>| async move {
loop {
match inbox.recv().await {
Ok(msg) => match msg {
MyProtocol::MyRequest((request, tx)) => {
println!("Received request: {:?}", request.param);
tx.send(100).unwrap();
}
MyProtocol::String(string) => {
println!("Received message: {:?}", string);
}
},
Err(e) => match e {
RecvError::Halted => break "Halted",
RecvError::ClosedAndEmpty => break "Closed",
},
}
}
});
// .. and send it some messages!
address.send("Hi".to_string()).await.unwrap();
let response = address
.request(MyRequest {
param: "Hi".to_string(),
})
.await
.unwrap();
assert_eq!(response, 100);
let response = address
.my_request("Hi".to_string())
.request()
.await
.unwrap();
assert_eq!(response, 100);
child.halt();
assert_eq!(child.await.unwrap(), "Halted");
}
依赖
~5–12MB
~122K SLoC