Yet another actor crate for rust. This crate exists specifically to answer quickwit needs. The API may change in the future.
Actor::runner
method makes it possible to run an actor with blocking code on a dedicated thread.```rust use std::time::Duration; use asynctrait::asynctrait; use quickwit_actors::{Handler, Actor, Universe, ActorContext, ActorExitStatus, Mailbox};
struct PingReceiver;
impl Actor for PingReceiver { type ObservableState = (); fn observable_state(&self) -> Self::ObservableState {} }
impl Handler
struct PingSender {
peer: Mailbox
struct Loop;
struct Ping;
impl Actor for PingSender { type ObservableState = (); fn observable_state(&self) -> Self::ObservableState {}
async fn initialize(&mut self, ctx: &ActorContext<Self>) -> Result<(),ActorExitStatus> {
ctx.send_self_message(Loop).await?;
Ok(())
}
}
impl Handler
async fn handle(
&mut self,
_: Loop,
ctx: &ActorContext<Self>,
) -> Result<(), ActorExitStatus> {
let reply_msg = ctx.ask(&self.peer, Ping).await.unwrap();
println!("{reply_msg}");
ctx.schedule_self_msg(Duration::from_secs(1), Loop).await;
Ok(())
}
}
async fn main() { let universe = Universe::new();
let (recv_mailbox, _) =
universe.spawn_actor(PingReceiver::default()).spawn();
let ping_sender = PingSender { peer: recv_mailbox };
let (_, ping_sender_handler) = universe.spawn_actor(ping_sender).spawn();
ping_sender_handler.join().await;
} ```