#future #channel #async

want

检测其他Future何时需要结果

10个版本

0.3.1 2023年6月14日
0.3.0 2019年8月20日
0.2.0 2019年3月19日
0.1.0 2018年4月6日
0.0.2 2018年3月16日

#25异步

Download history 1354353/week @ 2024-03-14 1355033/week @ 2024-03-21 1314648/week @ 2024-03-28 1365295/week @ 2024-04-04 1375469/week @ 2024-04-11 1362865/week @ 2024-04-18 1340545/week @ 2024-04-25 1327797/week @ 2024-05-02 1318787/week @ 2024-05-09 1378121/week @ 2024-05-16 1325204/week @ 2024-05-23 1492413/week @ 2024-05-30 1466876/week @ 2024-06-06 1472990/week @ 2024-06-13 1488645/week @ 2024-06-20 1219194/week @ 2024-06-27

5,938,781 每月下载量
18,242 个crate中使用 (5 直接使用)

MIT 协议

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