#actor #message #macro #tokio #define #attributes #simpl-actor

过程宏 simpl_actor_macros

简单的 tokio actors 宏

9 个版本

0.2.7 2024 年 3 月 28 日
0.2.6 2024 年 3 月 17 日
0.1.1 2024 年 3 月 11 日

过程宏 中排名 1806

每月下载量 28
用于 simpl_actor

MIT/Apache

48KB
898

simpl_actor

simpl_actor 是一个用于简化 Rust 应用程序中基于 actor 的并发的 Rust 库。它基于 Tokio 构建,利用异步/等待和 tokio mpsc 通道来实现高效直观的 actor 系统实现。

功能

  • 简单 Actor 定义:使用 Rust 结构体和属性宏轻松定义 actor。
  • 自动消息处理:利用 Rust 的类型系统和异步功能,以最少的代码实现消息处理。
  • 异步和同步消息处理:支持异步和同步消息处理,允许灵活的 actor 交互模式。
  • 生命周期管理:提供初始化、重启和停止 actor 的生命周期钩子,提供对 actor 生命周期的控制。

快速入门

定义 actor

use simpl_actor::{actor, Actor, Spawn};

#[derive(Actor)]
pub struct CounterActor {
    count: i64,
}

#[actor]
impl CounterActor {
    pub fn new() -> Self {
        CounterActor { count: 0 }
    }

    #[message]
    pub fn inc(&mut self, amount: i64) { ... }

    #[message]
    pub fn dec(&mut self, amount: i64) { ... }

    #[message(infallible)]
    pub fn count(&self) -> i64 { ... }
}

与 actor 交互

let counter = CounterActor::new();
let actor = counter.spawn();

actor.inc(2).await?;
actor.dec(1).await?;
let count = actor.count().await?;

消息变体

当你在 simpl_actor 中定义一个消息时,会自动生成两个消息处理函数的变体,用于同步和异步处理。

#[actor]
impl MyActor {
    #[message]
    fn msg(&self) -> Result<i32, Err> {}
}

// Generates
impl MyActorRef {
    /// Sends the messages, waits for processing, and returns a response.
    async fn msg(&self) -> Result<i32, SendError>;
    /// Sends the message after a delay.
    fn msg_after(&self, delay: Duration) -> JoinHandle<Result<Result<i32, Err>, SendError>>;
    /// Sends the message asynchronously, not waiting for a response.
    fn msg_async(&self) -> Result<(), SendError>;
    /// Sends the message asynchronously after a delay.
    fn msg_async_after(&self, delay: Duration) -> JoinHandle<Result<(), SendError>>;
}

如果方法没有任何生命周期,则只会生成 _after 和 _async 变体。

换句话说,所有参数都必须是拥有的或 &'static,否则异步变体才会生成,否则 actor 可能会引用已释放的内存,导致未定义行为 (UB)。

贡献

欢迎贡献!请随意提交拉取请求、创建问题或提出改进建议。

许可

simpl_actor 在以下两种许可下双许可:

由您选择。

这意味着您可以选择最适合您项目需求的许可证。

依赖项

~330–790KB
~19K SLoC