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::Sink and futures::stream::Stream

Ask if they would be helpful.

let (tx, rx) = batch_channel::unbounded();
let tx = tx.into_sync();

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 closed

Structs§

Functions§

  • Allocates a bounded channel and returns the sender, receiver pair.
  • Allocates a bounded channel and returns the synchronous handles as a sender, receiver pair.
  • Allocates an unbounded channel and returns the sender, receiver pair.
  • Allocates an unbounded channel and returns the synchronous handles as a sender, receiver pair.