An Actor similar to actix::Actor but can handle Messages with async/await.
This is an Actor implementation that mimics the API of actix, with several simplications for ease of use.
The primary purpose of this library is to enable Handlers to handle Messages with async fn:
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 also allows asyncronous message handling through ActorFuture and friends.
However, the returned ActorFuture can not reference the Actor, and only gets
access to it on every poll, which prevents the use of async and await language features.
Handler::handleis anasync fn.
For this to be sound, Messages sent to the same Actor must be processed sequentially, hence the name atomic-actor.
-
There's no
Messagetrait. All types that are'static + Sendcan be used asMessages. -
Actorhas no lifecycle. Once started, it'll run until allAddrs are dropped. -
Contextis very simple, can only be used to get a newAddrof the actor. -
Communication channel betwen
Addrand the worker thread is unbounded. We may add option for using bounded channel in the future.
After cloning this repository, please run cargo run --bin install-pre-commit-hook in the root folder.
This adds a git pre-commit hook to the repository, and checks code style and runs tests before every commit.