#actor #tokio #async #actor-system

thespian

Erlang 启发的异步actor并发模式

2 个不稳定版本

0.2.0 2020 年 12 月 13 日
0.1.0 2020 年 12 月 13 日

#44#actor-system

MIT/Apache

9KB
92

Thespian

status: experimental crate docs

Erlang 进程和监督者启发的异步actor并发模式。

许可证

许可协议为以下之一:

由您选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,应按上述方式双重许可,不附加任何额外条款或条件。


lib.rs:

简介

Thespian 实现了一个受 Erlang 进程和监督者启发的异步 Rust 基本的 actor 系统。

Thespian 不直接提供 Actor 的消息接口,而是使用用户定义在 impl Actor<State, Reply> 上的方法作为 actor 的外部 API。这使得使用 Actor 与使用结构体的引用没有区别。

Actor 的内部实现中,提供了一个机制在包含 Actor 状态的 Process 中运行函数。由于所有对状态的访问都由 Process 串行处理,因此系统的行为类似于典型的 Actor 系统。

虽然技术上 Process 在术语的典型使用中会被称作 actor,但在这个包中,actor 的邮箱被称为 Actor,以获得更好的可操作性和减少混淆。在邮箱上定义方法感觉奇怪且容易混淆。

待办事项

  • 修复使用 newtype 模式对 Actor 的使用方面的可操作性问题
  • 实现监督树

示例用法

#[tokio::main]
pub async fn main() {
    let (mut process, actor) =
        thespian::Process::<State, State>::new_with_state(State::Alpha);
    let toggle = Toggle(actor);

    let (_process_result, _task_result) = tokio::join! {
        async move {
            process.start().await;
        },
        async move {
            toggle.flip();
            toggle.flip();
            println!("get: {:?}", toggle.get().await);
        }
    };
}

#[derive(Copy, Clone, Debug)]
enum State {
    Alpha,
    Beta,
}

struct Toggle(thespian::Actor<State, State>);

impl Toggle {
    pub async fn get(&self) -> State {
        self.0.call_ref_reply(|state, reply| {
            reply.send(state.clone());
        }).await
    }

    pub fn flip(&self) {
        self.0.call_ref_mut(|state| {
            println!("state: {:?}", state);
            match state {
                State::Alpha => *state = State::Beta,
                State::Beta => *state = State::Alpha,
            }
        });
    }

}

依赖项

~4MB
~59K SLoC