Crate batch_channel
source ·Expand description
async MPMC channel that reduces overhead by reading and writing many values at once.
Sometimes large volumes of small values are farmed out to workers through a channel. Consider directory traversal: each readdir() call produces a batch of directory entries. Batching can help the consumption side too. Consider querying SQLite with received values – larger batches reduce the amortized cost of acquiring SQLite’s lock and bulk queries can be issued.
One can imagine natural, currently unimplemented, extensions to this crate:
- Channels with priority
- impls for
futures::sink::Sinkandfutures::stream::Stream
Ask if they would be helpful.
let (tx, rx) = batch_channel::unbounded();
tx.send(value).unwrap();
tx.send_iter([v1, v2, v3]).unwrap();
match rx.recv().await {
Some(value) => println!("single {value}"),
None => return "sender closed",
}
let batch = rx.recv_batch(100).await;
// batch.is_empty() means sender closedStructs
- Automatically sends values on the channel in batches.
- The sending half of a bounded channel.
- The receiving half of a channel.
- An error returned from Sender::send when all Receivers are dropped.
- The sending half of an unbounded channel.
Functions
- Allocates a new, bounded channel and returns the sender, receiver pair.
- Allocates a new, unbounded channel and returns the sender, receiver pair.