36 releases

0.11.0 Aug 16, 2023
0.10.14 Jul 21, 2022
0.10.13 Jun 10, 2022
0.10.12 Mar 10, 2022
0.2.0 Jul 31, 2019

#8 in Concurrency

Download history 212471/week @ 2023-08-09 232602/week @ 2023-08-16 242715/week @ 2023-08-23 231787/week @ 2023-08-30 255400/week @ 2023-09-06 252809/week @ 2023-09-13 258619/week @ 2023-09-20 267276/week @ 2023-09-27 298230/week @ 2023-10-04 319008/week @ 2023-10-11 312989/week @ 2023-10-18 323004/week @ 2023-10-25 324552/week @ 2023-11-01 323624/week @ 2023-11-08 360294/week @ 2023-11-15 252653/week @ 2023-11-22

1,322,319 downloads per month
Used in 1,252 crates (333 directly)

Apache-2.0/MIT

77KB
1.5K SLoC

Flume

A blazingly fast multi-producer, multi-consumer channel.

Cargo Documentation License actions-badge

use std::thread;

fn main() {
    println!("Hello, world!");

    let (tx, rx) = flume::unbounded();

    thread::spawn(move || {
        (0..10).for_each(|i| {
            tx.send(i).unwrap();
        })
    });

    let received: u32 = rx.iter().sum();

    assert_eq!((0..10).sum::<u32>(), received);
}

Why Flume?

  • Featureful: Unbounded, bounded and rendezvous queues
  • Fast: Always faster than std::sync::mpsc and sometimes crossbeam-channel
  • Safe: No unsafe code anywhere in the codebase!
  • Flexible: Sender and Receiver both implement Send + Sync + Clone
  • Familiar: Drop-in replacement for std::sync::mpsc
  • Capable: Additional features like MPMC support and send timeouts/deadlines
  • Simple: Few dependencies, minimal codebase, fast to compile
  • Asynchronous: async support, including mix 'n match with sync code
  • Ergonomic: Powerful select-like interface

Usage

To use Flume, place the following line under the [dependencies] section in your Cargo.toml:

flume = "x.y"

Cargo Features

Flume comes with several optional features:

  • spin: use spinlocks instead of OS-level synchronisation primitives internally for some kind of data access (may be more performant on a small number of platforms for specific workloads)

  • select: Adds support for the Selector API, allowing a thread to wait on several channels/operations at once

  • async: Adds support for the async API, including on otherwise synchronous channels

  • eventual-fairness: Use randomness in the implementation of Selector to avoid biasing/saturating certain events over others

You can enable these features by changing the dependency in your Cargo.toml like so:

flume = { version = "x.y", default-features = false, features = ["async", "select"] }

Benchmarks

Although Flume has its own extensive benchmarks, don't take it from here that Flume is quick. The following graph is from the crossbeam-channel benchmark suite.

Tests were performed on an AMD Ryzen 7 3700x with 8/16 cores running Linux kernel 5.11.2 with the bfq scheduler.

Flume benchmarks (crossbeam benchmark suite)

License

Flume is licensed under either of:

Dependencies

~140–450KB