15 个版本 (8 个破坏性更新)
0.9.0 | 2024 年 6 月 25 日 |
---|---|
0.8.0 | 2024 年 4 月 19 日 |
0.3.2 | 2024 年 3 月 31 日 |
#103 在 并发
每月 662 次下载
160KB
3.5K SLoC
卡美奥 🧚🏻
基于 Tokio 构建的容错异步 Actor
- 异步:基于 tokio,actors 在它们自己的独立派生任务中异步运行。
- 监督:通过子/父/兄弟关系链接 actors,创建依赖关系。
- 有界/无界 MPSC 通道:使用 mpsc 通道在 actors 之间进行消息传递,有界性可配置。
- 并发查询:在不需要可变状态时支持查询的并发处理。
- 恐慌安全:内部捕获恐慌,允许 actors 重新启动。
安装
使用 cargo add
cargo add kameo
或手动添加到依赖项中
[dependencies]
kameo = "*"
不使用宏定义 Actor
use kameo::Actor;
use kameo::message::{Context, Message};
// Define the actor state
struct Counter {
count: i64,
}
impl Actor for Counter {}
// Define messages
struct Inc { amount: u32 }
impl Message<Inc> for Counter {
type Reply = i64;
async fn handle(&mut self, msg: Counter, _ctx: Context<'_, Self, Self::Reply>) -> Self::Reply {
self.count += msg.0 as i64;
self.count
}
}
使用宏定义 Actor
use kameo::{messages, Actor};
// Define the actor state
#[derive(Actor)]
struct Counter {
count: i64,
}
// Define messages
#[messages]
impl Counter {
#[message]
fn inc(&mut self, amount: u32) -> i64 {
self.count += amount as i64;
self.count
}
}
查看生成的宏代码
// Derive Actor
impl kameo::actor::Actor for Counter {
type Mailbox = kameo::actor::UnboundedMailbox<Self>;
fn name(&self) -> Cow<'_, str> {
Cow::Borrowed("Counter")
}
}
// Messages
struct Inc { amount: u32 }
impl kameo::message::Message<Inc> for Counter {
type Reply = i64;
async fn handle(&mut self, msg: &mut Inc, _ctx: Context<'_, Self, Self::Reply>) -> Self::Reply {
self.inc(msg.amount)
}
}
启动 Actor & 消息传递
let counter_ref = kameo::spawn(Counter { count: 0 });
let count = counter_ref.ask(Inc(42)).send().await?;
println!("Count is {count}");
ActorRef::ask
基准测试
与 Actix 相比,吞吐量提高 13 倍
以下显示向 Kameo 和 Actix 中的 actor 发送消息的基本基准测试。请始终自行基准测试。
基准测试结果
向 actor 发送消息
基准测试 | 时间 |
---|---|
卡美奥 未同步消息 | 432.26 纳秒 |
卡美奥 同步消息 | 503.89 纳秒 |
卡美奥 查询 | 1.3000 微秒 |
Actix 消息 | 5.7545 微秒 |
在 actor 中处理 Fibonacci 序列,直到 20
基准测试 | 时间 |
---|---|
卡美奥 未同步消息 | 18.229 微秒 |
卡美奥 同步消息 | 18.501 微秒 |
卡美奥 查询 | 19.257 微秒 |
Actix 消息 | 27.442 微秒 |
贡献
欢迎贡献!请随意提交拉取请求、创建问题或提出改进建议。
许可证
kameo
在以下任一许可证下双许可
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
任选其一。
依赖项
~4–5.5MB
~97K SLoC