#parallel #performance #thread #join

dynqueue

Dynamically extendable Rayon parallel iterator

7 releases

0.3.0 Oct 12, 2020
0.2.1 Jul 20, 2020
0.1.3 Jun 22, 2020
0.1.2 May 25, 2020

#661 in Concurrency

Download history 22/week @ 2023-10-21 37/week @ 2023-10-28 31/week @ 2023-11-04 32/week @ 2023-11-11 40/week @ 2023-11-18 51/week @ 2023-11-25 26/week @ 2023-12-02 40/week @ 2023-12-09 22/week @ 2023-12-16 33/week @ 2023-12-23 17/week @ 2023-12-30 19/week @ 2024-01-06 25/week @ 2024-01-13 23/week @ 2024-01-20 33/week @ 2024-01-27 20/week @ 2024-02-03

105 downloads per month
Used in 5 crates (via shredder)

MIT license

16KB
358 lines

Rust Coverage Status

DynQueue - dynamically extendable Rayon parallel iterator

A DynQueue<T> can be iterated with into_par_iter producing (DynQueueHandle, T) elements. With the DynQueueHandle<T> a new T can be inserted in the DynQueue<T>, which is currently iterated over.

A Vec<T>, VecDeque<T> and crossbeam_queue::SegQueue<T> (with feature = "crossbeam-queue") can be turned into a DynQueue<T> with .into_dyn_queue().

use rayon::iter::IntoParallelIterator as _;
use rayon::iter::ParallelIterator as _;

use dynqueue::IntoDynQueue as _;

fn main() {
    let mut result = vec![1, 2, 3]
        .into_dyn_queue()
        .into_par_iter()
        .map(|(handle, value)| { if value == 2 { handle.enqueue(4) }; value })
        .collect::<Vec<_>>();
    result.sort();

    assert_eq!(result, vec![1, 2, 3, 4]);
}

Features

  • crossbeam-queue : to use crossbeam::queue::SegQueue as the inner collection.

Changelog

0.2.0

  • introduce IntoDynQueue
  • handle lockless collections

0.1.0

  • initial version

Dependencies

~1.5MB
~25K SLoC