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