async-watch

Async watch channel

2 releases

0.3.1 Oct 7, 2020
0.3.0 Sep 12, 2020
0.2.0 Aug 30, 2020
0.1.0 May 31, 2020

#2061 in Asynchronous

Download history 2468/week @ 2024-07-29 1872/week @ 2024-08-05 1476/week @ 2024-08-12 1963/week @ 2024-08-19 2085/week @ 2024-08-26 1668/week @ 2024-09-02 1535/week @ 2024-09-09 1719/week @ 2024-09-16 1531/week @ 2024-09-23 1566/week @ 2024-09-30 1550/week @ 2024-10-07 1423/week @ 2024-10-14 1374/week @ 2024-10-21 1546/week @ 2024-10-28 1398/week @ 2024-11-04 1408/week @ 2024-11-11

5,851 downloads per month
Used in ic-agent

Apache-2.0 OR MIT

16KB
157 lines

async-watch

Build License Cargo Documentation

A single-producer, multi-consumer channel that only retains the last sent value.

Extracted from Tokio's tokio::sync::watch implementation, which was written by Carl Lerche.

License

async-watch is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.


lib.rs:

A single-producer, multi-consumer channel that only retains the last sent value.

Extracted from Tokio's tokio::sync::watch implementation, which was written by Carl Lerche.

This channel is useful for watching for changes to a value from multiple points in the code base, for example, changes to configuration values.

Usage

channel returns a Sender / Receiver pair. These are the producer and sender halves of the channel. The channel is created with an initial value. The latest value stored in the channel is accessed with [Receiver::borrow()]. Awaiting [Receiver::changed()] waits for a new value to sent by the Sender half. Awaiting [Receiver::recv()] combines [Receiver::changed()] and [Receiver::borrow()] where the borrowed value is cloned and returned.

Examples

let (tx, mut rx) = async_watch::channel("hello");
let mut rx2 = rx.clone();

// First variant
executor.spawn(async move {
    while let Ok(value) = rx.recv().await {
        println!("received = {:?}", value);
    }
});

// Second variant
executor.spawn(async move {
    while rx2.changed().await.is_ok() {
        println!("received = {:?}", *rx2.borrow());
    }
});

tx.send("world").unwrap();

Closing

Sender::closed allows the producer to detect when all Receiver handles have been dropped. This indicates that there is no further interest in the values being produced and work can be stopped.

Thread safety

Both Sender and Receiver are thread safe. They can be moved to other threads and can be used in a concurrent environment. Clones of Receiver handles may be moved to separate threads and also used concurrently.

Dependencies

~135KB