Actor

El actor es la primitiva principal del modelo. Son livianos, se pueden crear miles (en lugar de threads). Encapsulan comportamiento y estado. El actor supervisor puede crear otros actores hijo.

use std::time::Duration;
use actix::prelude::*;

struct Producer {
    interval: Duration,
    consumer: Addr<Consumer>,
}

impl Actor for Producer {
    type Context = Context<Self>;

    fn started(&mut self, ctx: &mut Self::Context) {
        ctx.run_interval(self.interval, |act, _ctx| {
            let num = rand::random::<u32>();
            act.consumer.do_send(AddNumber(num));
        });
    }
}

struct AddNumber(u32);

impl Message for AddNumber {
    type Result = ();
}

struct GetSum;

impl Message for GetSum {
    type Result = u32;
}

struct Consumer {
    sum: u32,
}

impl Actor for Consumer {
    type Context = Context<Self>;
}

impl Handler<AddNumber> for Consumer {
    type Result = ();

    fn handle(&mut self, msg: AddNumber, _ctx: &mut Self::Context) -> Self::Result {
        self.sum += msg.0;
    }
}

impl Handler<GetSum> for Consumer {
    type Result = u32;

    fn handle(&mut self, _msg: GetSum, _ctx: &mut Self::Context) -> Self::Result {
        self.sum
    }
}

fn main() {
    let system = System::new();

    let consumer = Consumer { sum: 0 }.start();
    let _producer = Producer {
        interval: Duration::from_secs(1),
        consumer,
    }
    .start();

    system.run().unwrap();
}