#actor #tokio #actor-system #macro

simpl_actor

简单的tokio actor

9个版本

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

287异步

Download history 3/week @ 2024-04-04 1/week @ 2024-05-30

每月下载量540

MIT/Apache

39KB
669

simpl_actor

simpl_actor是一个Rust库,用于简化Rust应用程序中基于actor的并发。它建立在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。

贡献

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

许可证

simpl_actor可以选择以下许可证之一进行双许可

任选其一。

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

依赖项

~3–5MB
~85K SLoC