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 异步

MIT/Apache

13KB
106

lwactors

Build Status

使用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的线程都可以调用addsubtract来发送消息,并接收一个解析为i64的future,该值是处理该消息后的计数器状态。

处理消息的正在运行的future将在所有Counter都已释放时成功完成。

依赖项

~0.9–15MB
~151K SLoC