#session #type #deadlock #safety #async

rumpsteak-macros

多方之间异步通信的会话类型

1 个不稳定版本

0.1.0 2021年2月15日

#17#deadlock


用于 rumpsteak

MIT 许可证

13KB
298

🍖 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 文件。

依赖项

~1.5MB
~36K SLoC