1 个不稳定版本

0.1.0 2022年10月13日

#28 in #bidirectional

Download history 115/week @ 2024-03-13 156/week @ 2024-03-20 261/week @ 2024-03-27 73/week @ 2024-04-03 171/week @ 2024-04-10 115/week @ 2024-04-17 152/week @ 2024-04-24 1/week @ 2024-05-01 31/week @ 2024-05-08 105/week @ 2024-05-15 20/week @ 2024-05-22 198/week @ 2024-05-29 18/week @ 2024-06-05 51/week @ 2024-06-12 12/week @ 2024-06-19 27/week @ 2024-06-26

108 每月下载量

自定义许可证

15KB
128

响应通道

一个简单的包装 tokio::sync::mpsc 通道的包装器,以提供双向响应通道。

通常,实例化一个双向通道是繁琐的,需要大量的模板代码。《response_channel》提供了一个方法,使用与创建常规 tokio::sync::mpsc 通道相同的 API 来创建双向响应通道(即只需调用一个函数)。

use tokio::task::spawn;
use tokio::join;

type Message = u8;
type Response = u8;

fn main() {
    const BUFFER_SIZE: usize = 10;
    let (mut tx, mut rx) = response_channel::channel::<Message, Response>(BUFFER_SIZE, None);
    let fut1 = spawn(async move {
        for i in 0..10 {
            let response = tx.send_await_automatic(i).await.unwrap().unwrap();
            assert_eq!(response, i + 1);
        };
    });
    let fut2 = spawn(async move {
        while let Some((message, tx)) = rx.recv().await {
            let response = message + 1;
            tx.send(response).await.unwrap();
        };
    });
    let (res1, res2) = join!(fut1, fut2);
    res1.unwrap();
    res2.unwrap();
}

实现注意事项

也存在多个 response_channel::Sender,每个都能向 Receiver 发送自己的消息并接收本地化响应!具体来说,如果一个特定的 response_channel::SenderReceiver 发送消息,其他 response_channel::Sender无法 看到响应。

response_channel::Sender 结构内部包含正向传输线、反向传输线和反向接收线。需要保留反向传输线的原因是,这样 response_channel::Sender 可以将传输线作为参数发送。然后,Receiver 可以接收消息(包含数据和反向传输线),处理数据,并使用给定的传输线进行响应。

注意,克隆 response_channel::Sender 将克隆内部 tokio::sync::mpsc::Sender(因此将击中相同的 Receiver)。然而,它将创建一个新的反向通道。这是有意义的,因为正在创建一个新的通道,所以需要创建一个新的反向通道。

依赖关系

~2.3–4MB
~65K SLoC