1个不稳定版本
| 0.1.0 | 2022年6月2日 |
|---|
#2041 in 异步
10KB
150 行
atomic-actor
一个类似actix的Actor,但可以处理带有async/await的Message。
这是一个模仿actix API的Actor实现,为了便于使用进行了简化。
示例
此库的主要目的是使Handler能够以异步方式处理Message。
use async_trait::async_trait;
use atomic_actor::*;
struct I32Actor(i32);
impl Actor for I32Actor {
type Context = Context<Self>;
}
#[async_trait]
impl Handler<Vec<i32>> for I32Actor {
type Result = i32;
async fn handle(&mut self, message: Vec<i32>, _: &mut Context<Self>) -> i32 {
for value in message {
async { self.0 += value }.await;
}
self.0
}
}
#[tokio::main]
async fn main() {
let addr = I32Actor(0).start();
assert_eq!(addr.send(vec![1, 2, 3]).unwrap().await, 6);
}
actix也允许通过ActorFuture和类似功能进行异步消息处理。然而,返回的ActorFuture不能引用Actor,并且只能在每次轮询时访问它,这阻止了使用async和await语言功能。
与actix的区别
Handler::handle是一个异步函数。
为了使这一点合理,发送到同一Actor的消息必须顺序处理,因此得名atomic-actor。
-
没有
Message特质。所有符合'static + Send的类型都可以用作Message。 -
Actor没有生命周期。一旦启动,它将一直运行,直到所有Addr被丢弃。 -
Context非常简单,只能用于获取演员的新Addr。 -
Addr和工作者线程之间的通信通道是无界的。我们可能会在未来添加使用有界通道的选项。
对于开发者
在克隆此存储库后,请在根目录中运行cargo run --bin install-pre-commit-hook。
这将在存储库中添加一个git预提交钩子,并在每次提交之前检查代码样式和运行测试。
依赖关系
~3–4.5MB
~79K SLoC