1 个不稳定版本
0.1.0 | 2021年2月15日 |
---|
#17 在 #deadlock
用于 rumpsteak
13KB
298 行
🍖 Rumpsteak
⚠️ Rumpsteak 目前处于开发中,API 可能会大幅更改。请随意尝试示例,但请不要在生产应用中使用 Rumpsteak!
Rumpsteak 是一个 Rust 框架,用于 安全 和 高效 地实现 消息传递 异步 程序。它使用多方会话类型来静态保证通信错误(如死锁)的缺失,并使用异步子类型来优化通信。
多方会话类型(MPST)验证消息传递协议的安全性,如《多方会话类型简介》中所述。异步子类型是在《异步多方会话的精确子类型》中引入的,用于 MPST,它验证消息的重排序,以创建比 MPST 通常可能实现的更优化的实现。
功能
- 提供无死锁的通信。
- 与
async
/await
代码集成。 - 支持任意数量的参与者。
- 包含基准测试以跟踪性能。
用法
将以下内容添加到您的 Cargo.toml
文件中。
[dependencies]
rumpsteak = "0.1"
示例
use futures::{
channel::mpsc::{UnboundedReceiver, UnboundedSender},
executor, try_join,
};
use rumpsteak::{
channel::Bidirectional, session, try_session, End, Message, Receive, Role, Roles, Send,
};
use std::{error::Error, result};
type Result<T> = result::Result<T, Box<dyn Error>>;
type Channel = Bidirectional<UnboundedSender<Label>, UnboundedReceiver<Label>>;
#[derive(Roles)]
struct Roles(C, S);
#[derive(Role)]
#[message(Label)]
struct C(#[route(S)] Channel);
#[derive(Role)]
#[message(Label)]
struct S(#[route(C)] Channel);
#[derive(Message)]
enum Label {
Add(Add),
Sum(Sum),
}
struct Add(i32);
struct Sum(i32);
#[session]
type Client = Send<S, Add, Send<S, Add, Receive<S, Sum, End>>>;
#[session]
type Server = Receive<C, Add, Receive<C, Add, Send<C, Sum, End>>>;
async fn client(role: &mut C, x: i32, y: i32) -> Result<i32> {
try_session(role, |s: Client<'_, _>| async {
let s = s.send(Add(x)).await?;
let s = s.send(Add(y)).await?;
let (Sum(z), s) = s.receive().await?;
Ok((z, s))
})
.await
}
async fn server(role: &mut S) -> Result<()> {
try_session(role, |s: Server<'_, _>| async {
let (Add(x), s) = s.receive().await?;
let (Add(y), s) = s.receive().await?;
let s = s.send(Sum(x + y)).await?;
Ok(((), s))
})
.await
}
fn main() {
let Roles(mut c, mut s) = Roles::default();
executor::block_on(async {
let (output, _) = try_join!(client(&mut c, 1, 2), server(&mut s)).unwrap();
assert_eq!(output, 3);
});
}
结构
benches/
基准测试套件,以跟踪 Rumpsteak 随时间的变化性能。
caching/
基于 Redis 的 HTTP 缓存案例研究。
comparison/
与其他 Rust 会话类型实现的比较。
examples/
许多使用 Rumpsteak 的流行协议的示例。
generate/
从有限状态机自动生成 Rumpsteak API 的代码。
macros/
用于 Rumpsteak API 中的过程宏的 crate。
oneshot/
使用单次通道进行通信的过时实验性实现。
许可证
根据 MIT 许可证授权。有关详细信息,请参阅 LICENSE 文件。
依赖项
~1.5MB
~36K SLoC