9个版本
0.2.0 | 2020年12月28日 |
---|---|
0.1.1 | 2020年1月8日 |
0.1.0 | 2019年11月8日 |
0.0.6 | 2019年8月20日 |
0.0.4 | 2018年2月25日 |
#1222 in 异步
13KB
106 行
lwactors
使用futures-rs
的Rust轻量级actor。
简介
简而言之,你可能想使用Actix。
此库允许在应用程序中使用Futures存在独立的“actor”。
actor使用初始状态创建。从那里,状态只能通过传递消息并使用invoke
函数来查询或修改,该函数接收一个结果,该结果将在消息被处理后包含。消息是异步处理的。
请参阅"计数器"示例,了解如何围绕此库构建actor的建议。
概述
actor本身
应用程序将包含一个针对每个actor定制的结构,该结构将拥有对底层future的引用
#[derive(Clone)]
struct Counter {
queue: ActorSender<CounterAction, i64, CounterError>,
}
当构造时,会调用lwactors
actor
函数以启动actor的运行
fn new(cpu_pool: &CpuPool) -> Counter {
Counter {
queue: actor(cpu_pool, 0),
}
}
它需要一个对CpuPool
(或另一个Executor
)的引用以及初始状态,在这种情况下为0
。
动作 - 可能的消息集合
然后应用程序将定义可以发送给actor的消息集
#[derive(Debug)]
enum CounterAction {
Add(i64),
Subtract(i64),
}
以及actor在处理消息时将运行的代码
impl Action<i64, i64, CounterError> for CounterAction {
fn act(self, state: &mut i64) -> Result<i64, CounterError> {
println!("Acting {:?} on {}", self, state);
match self {
CounterAction::Add(i) => *state += i,
CounterAction::Subtract(i) => *state -= i,
}
return Ok(*state);
}
}
用法
最后,为了公开友好级的高层API,应用程序可以实现特定的函数,这些函数负责向actor发送消息
impl Counter {
// new function quoted above goes here
fn add(&self, n: i64) -> CounterFuture {
self.queue.invoke(CounterAction::Add(n))
}
fn subtract(&self, n: i64) -> CounterFuture {
self.queue.invoke(CounterAction::Subtract(n))
}
}
包含对actor引用的结构Counter
可以廉价地克隆,但它们都引用相同的正在运行的future,该future处理消息,因此它们间接引用相同的共享状态。每个拥有Counter
的线程都可以调用add
或subtract
来发送消息,并接收一个解析为i64
的future,该值是处理该消息后的计数器状态。
处理消息的正在运行的future将在所有Counter
都已释放时成功完成。
依赖项
~0.9–15MB
~151K SLoC