Crates.io | atomic-actor |
lib.rs | atomic-actor |
version | 0.1.0 |
source | src |
created_at | 2022-06-02 10:05:50.367524 |
updated_at | 2022-06-02 10:05:50.367524 |
description | An `Actor` with `async fn` handlers. |
homepage | |
repository | https://github.com/chubei-oppen/atomic-actor |
max_upload_size | |
id | 598782 |
size | 9,984 |
An Actor
similar to actix::Actor
but can handle Message
s 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 Handler
s to handle Message
s 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.
actix
Handler::handle
is an async fn
.For this to be sound, Message
s sent to the same Actor
must be processed sequentially, hence the name atomic-actor
.
There's no Message
trait. All types that are 'static + Send
can be used as Message
s.
Actor
has no lifecycle. Once started, it'll run until all Addr
s are dropped.
Context
is very simple, can only be used to get a new Addr
of the actor.
Communication channel betwen Addr
and 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.