10个版本
0.3.1 | 2023年6月14日 |
---|---|
0.3.0 | 2019年8月20日 |
0.2.0 | 2019年3月19日 |
0.1.0 |
|
0.0.2 | 2018年3月16日 |
#25 在 异步
5,938,781 每月下载量
在 18,242 个crate中使用 (5 直接使用)
20KB
278 行
Want
一个用于在需要值时发出信号的Futures通道类实用工具。
Futures应该是懒加载的,只有当调用Future::poll
时才开始工作。Stream也是一样,但当你将通道用作Stream时,很难知道接收者是否准备好接收下一个值。
换句话说,给定一个(tx, rx)
,从futures::sync::mpsc::channel()
,发送者(tx
)如何知道接收者(rx
)实际上需要更多工作?仅仅因为通道缓冲区有空位,并不意味着工作会被接收者使用。
这就是类似want
的作用所在。添加到通道后,您可以确保当rx
对其调用poll()
且缓冲区为空时,tx
才创建消息并发送。
许可证
want
根据MIT许可证提供。见LICENSE。
lib.rs
:
一个用于在需要值时发出信号的Futures通道类实用工具。
Futures应该是懒加载的,只有当调用Future::poll
时才开始工作。Stream也是一样,但当你将通道用作Stream时,很难知道接收者是否准备好接收下一个值。
换句话说,给定一个(tx, rx)
,从futures::sync::mpsc::channel()
,发送者(tx
)如何知道接收者(rx
)实际上需要更多工作?仅仅因为通道缓冲区有空位,并不意味着工作会被接收者使用。
这就是类似want
的作用所在。添加到通道后,您可以确保当rx
对其调用poll()
且缓冲区为空时,tx
才创建消息并发送。
示例
extern crate want;
// Some message that is expensive to produce.
struct Expensive;
// Some futures-aware MPSC channel...
let (mut tx, mut rx) = mpsc_channel();
// And our `want` channel!
let (mut gv, mut tk) = want::new();
// Our receiving task...
spawn(async move {
// Maybe something comes up that prevents us from ever
// using the expensive message.
//
// Without `want`, the "send" task may have started to
// produce the expensive message even though we wouldn't
// be able to use it.
if !we_still_want_message() {
return;
}
// But we can use it! So tell the `want` channel.
tk.want();
match rx.recv().await {
Some(_msg) => println!("got a message"),
None => println!("DONE"),
}
});
// Our sending task
spawn(async move {
// It's expensive to create a new message, so we wait until the
// receiving end truly *wants* the message.
if let Err(_closed) = gv.want().await {
// Looks like they will never want it...
return;
}
// They want it, let's go!
tx.send(Expensive);
});
依赖项
~9KB