#actor #actor-system #pool #tokio

zestors

一个快速灵活的 Actor 框架,用于构建容错 Rust 应用程序

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

MIT/Apache

220KB
4.5K SLoC

Crates.io version shield Docs Crates.io license shield

Zestors

一个快速灵活的 Actor 框架,用于构建容错 Rust 应用程序,灵感来自 Erlang/OTP。

入门指南

Zestors 在 docs.rs 上有详细的文档,包括系统的大部分方面的指南和一个快速入门指南。这是推荐的开始方式。

注意

Zestors 还处于早期开发阶段,尽管 zestors 的核心部分已经稳定了一段时间,但从 handler 模块开始,预计会有很大的变化。与其私下完善一切,我更愿意将其发布出来,看看人们的想法。系统的某些部分已经进行了广泛的测试,但(很可能)存在错误。

如果您有任何反馈,无论是错误、不清楚的地方还是灵感/想法,我都非常愿意听取!

未来工作

  1. 完成 handler 模块的设计,并继续开发即将发布的 supervision crate。
  2. 继续进行单元测试和集成测试,并构建一些更大的示例。
  3. 开始设计和开发分布式环境。一切从零开始设计,考虑到分布性,但细节尚未完善。

最小示例

#[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