2 个不稳定版本
0.2.0 | 2020 年 12 月 13 日 |
---|---|
0.1.0 | 2020 年 12 月 13 日 |
#44 在 #actor-system
9KB
92 行
Thespian
Erlang 进程和监督者启发的异步actor并发模式。
许可证
许可协议为以下之一:
- Apache 许可协议第 2 版 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据 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