1 个不稳定版本
0.1.0 | 2022年10月13日 |
---|
#28 in #bidirectional
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::Sender
向 Receiver
发送消息,其他 response_channel::Sender
将 无法 看到响应。
response_channel::Sender
结构内部包含正向传输线、反向传输线和反向接收线。需要保留反向传输线的原因是,这样 response_channel::Sender
可以将传输线作为参数发送。然后,Receiver
可以接收消息(包含数据和反向传输线),处理数据,并使用给定的传输线进行响应。
注意,克隆 response_channel::Sender
将克隆内部 tokio::sync::mpsc::Sender
(因此将击中相同的 Receiver
)。然而,它将创建一个新的反向通道。这是有意义的,因为正在创建一个新的通道,所以需要创建一个新的反向通道。
依赖关系
~2.3–4MB
~65K SLoC