1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016年2月11日

#1175 in 并发

MIT/Apache

3KB

actress

一个简单的 Rust actor 库。仍然处于 1.0 版本之前,即“尚未完全准备好”

简介

Actress 利用 Rust 中已经提供的许多功能,并以您的数据和结构为中心。

为此,Acress 支持一个名为 Actor 的 trait,该 trait 表示您要用于 actor 系统的数据类型所需的最小要求。一旦将满足这些要求的值传递到 spawn 中,系统就会将您的数据结构转换为 actor/active object。完成后,它会将您可以与之通信的通道端点交给你。

一旦创建了 actor,您就不能再直接与之交互。本质上,它变得隔离(得益于 Rust 的类型系统!),从而有效地使其所有通信都是异步的。

另一个关键特性是通过消息通道与 actor 通信是一体化的。也就是说,您在创建 actor 时得到的端点也用作检测 actor 健康状态的方式。如果一个 actor 关闭了其通道的一侧,那么在您读取消息时这将是可以检测到的。

使用方法

包含 actress 库

extern crate actress;

然后,在您的结构体上实现 Actor trait

struct SimpleActor {
  state: i32
}

impl actress::Actor for SimpleActor {
  type MessageType = i32;
  fn recv(&mut self, msg: i32) -> bool { self.state = msg; msg == 42 }
}

最后,创建并使用您的新 actor

let simple_actor = SimpleActor { state: 1 };
let actor = actress::spawn(simple_actor);
actor.send(10);

示例:双向回声

extern crate actress;

use std::sync::mpsc::{Sender, SendError, channel};

enum Message { Ping(Sender<Message>), Pong }

struct EchoActor;

impl actress::Actor for EchoActor {
    type MessageType = Message;

    fn recv(&mut self, msg: Self::MessageType) -> bool {
        match msg {
            Message::Ping(c) => { println!("Ping!"); c.send(Message::Pong).unwrap(); true },
            _ => { false }
        }
    }
}

fn act() -> Result<(), SendError<Message>> {
    let echo_actor = EchoActor;

    let (response_tx, response_rx) = channel();

    let actor = actress::spawn(echo_actor);
    try!(actor.send(Message::Ping(response_tx)));

    match response_rx.recv() {
        Ok(Message::Pong) => println!("Pong!"),
        _ => println!("Error receiving response from actor")
    }

    Ok(())
}

fn main() {
    match act() {
        Ok(_) => println!("Message sends complete"),
        _ => println!("Message sends had errors")
    }
}

无运行时依赖