1个不稳定版本
0.1.0 | 2021年2月15日 |
---|
#932 在 异步
19KB
383 代码行
🍖 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 文件。
依赖项
~2.5MB
~50K SLoC