#session #type #deadlock #safety #async #multi-party

rumpsteak

多方会话类型,用于实现多方间的异步通信

1个不稳定版本

0.1.0 2021年2月15日

#932异步

MIT 许可协议

19KB
383 代码行

🍖 Rumpsteak

Actions Crate Docs License

⚠️ 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