#actix-actor #actor #async #actix #async-await

atomic-actor

带有异步处理器的Actor

1个不稳定版本

0.1.0 2022年6月2日

#2041 in 异步

MIT/Apache

10KB
150

atomic-actor

Crate Crates.io API

一个类似actixActor,但可以处理带有async/awaitMessage

这是一个模仿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,并且只能在每次轮询时访问它,这阻止了使用asyncawait语言功能。

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