1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2016年2月11日 |
---|
#1175 in 并发
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")
}
}