add stream parallelism extension combinators
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
19f6d9d0e1
commit
8ab825b12c
3 changed files with 76 additions and 3 deletions
|
@ -7,6 +7,7 @@ mod iter_stream;
|
||||||
mod ready;
|
mod ready;
|
||||||
mod tools;
|
mod tools;
|
||||||
mod try_broadband;
|
mod try_broadband;
|
||||||
|
mod try_parallel;
|
||||||
mod try_ready;
|
mod try_ready;
|
||||||
mod try_tools;
|
mod try_tools;
|
||||||
mod try_wideband;
|
mod try_wideband;
|
||||||
|
@ -24,6 +25,7 @@ pub use iter_stream::IterStream;
|
||||||
pub use ready::ReadyExt;
|
pub use ready::ReadyExt;
|
||||||
pub use tools::Tools;
|
pub use tools::Tools;
|
||||||
pub use try_broadband::TryBroadbandExt;
|
pub use try_broadband::TryBroadbandExt;
|
||||||
|
pub use try_parallel::TryParallelExt;
|
||||||
pub use try_ready::TryReadyExt;
|
pub use try_ready::TryReadyExt;
|
||||||
pub use try_tools::TryTools;
|
pub use try_tools::TryTools;
|
||||||
pub use try_wideband::TryWidebandExt;
|
pub use try_wideband::TryWidebandExt;
|
||||||
|
|
|
@ -18,7 +18,7 @@ where
|
||||||
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
where
|
where
|
||||||
N: Into<Option<usize>>,
|
N: Into<Option<usize>>,
|
||||||
F: Fn(Self::Ok) -> Fut + Send + Sync,
|
F: Fn(Self::Ok) -> Fut + Send,
|
||||||
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send;
|
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send;
|
||||||
|
|
||||||
fn broad_and_then<U, F, Fut>(
|
fn broad_and_then<U, F, Fut>(
|
||||||
|
@ -26,7 +26,7 @@ where
|
||||||
f: F,
|
f: F,
|
||||||
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
where
|
where
|
||||||
F: Fn(Self::Ok) -> Fut + Send + Sync,
|
F: Fn(Self::Ok) -> Fut + Send,
|
||||||
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
|
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
|
||||||
{
|
{
|
||||||
self.broadn_and_then(None, f)
|
self.broadn_and_then(None, f)
|
||||||
|
@ -44,7 +44,7 @@ where
|
||||||
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
where
|
where
|
||||||
N: Into<Option<usize>>,
|
N: Into<Option<usize>>,
|
||||||
F: Fn(Self::Ok) -> Fut + Send + Sync,
|
F: Fn(Self::Ok) -> Fut + Send,
|
||||||
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
|
Fut: TryFuture<Ok = U, Error = E, Output = Result<U, E>> + Send,
|
||||||
{
|
{
|
||||||
self.map_ok(f)
|
self.map_ok(f)
|
||||||
|
|
71
src/core/utils/stream/try_parallel.rs
Normal file
71
src/core/utils/stream/try_parallel.rs
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
//! Parallelism stream combinator extensions to futures::Stream
|
||||||
|
|
||||||
|
use futures::{stream::TryStream, TryFutureExt};
|
||||||
|
use tokio::{runtime, task::JoinError};
|
||||||
|
|
||||||
|
use super::TryBroadbandExt;
|
||||||
|
use crate::{utils::sys::available_parallelism, Error, Result};
|
||||||
|
|
||||||
|
/// Parallelism extensions to augment futures::StreamExt. These combinators are
|
||||||
|
/// for computation-oriented workloads, unlike -band combinators for I/O
|
||||||
|
/// workloads; these default to the available compute parallelism for the
|
||||||
|
/// system. Threads are currently drawn from the tokio-spawn pool. Results are
|
||||||
|
/// unordered.
|
||||||
|
pub trait TryParallelExt<T, E>
|
||||||
|
where
|
||||||
|
Self: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
|
||||||
|
E: From<JoinError> + From<Error> + Send + 'static,
|
||||||
|
T: Send + 'static,
|
||||||
|
{
|
||||||
|
fn paralleln_and_then<U, F, N, H>(
|
||||||
|
self,
|
||||||
|
h: H,
|
||||||
|
n: N,
|
||||||
|
f: F,
|
||||||
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
|
where
|
||||||
|
N: Into<Option<usize>>,
|
||||||
|
H: Into<Option<runtime::Handle>>,
|
||||||
|
F: Fn(Self::Ok) -> Result<U, E> + Clone + Send + 'static,
|
||||||
|
U: Send + 'static;
|
||||||
|
|
||||||
|
fn parallel_and_then<U, F, H>(
|
||||||
|
self,
|
||||||
|
h: H,
|
||||||
|
f: F,
|
||||||
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
|
where
|
||||||
|
H: Into<Option<runtime::Handle>>,
|
||||||
|
F: Fn(Self::Ok) -> Result<U, E> + Clone + Send + 'static,
|
||||||
|
U: Send + 'static,
|
||||||
|
{
|
||||||
|
self.paralleln_and_then(h, None, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, E, S> TryParallelExt<T, E> for S
|
||||||
|
where
|
||||||
|
S: TryStream<Ok = T, Error = E, Item = Result<T, E>> + Send + Sized,
|
||||||
|
E: From<JoinError> + From<Error> + Send + 'static,
|
||||||
|
T: Send + 'static,
|
||||||
|
{
|
||||||
|
fn paralleln_and_then<U, F, N, H>(
|
||||||
|
self,
|
||||||
|
h: H,
|
||||||
|
n: N,
|
||||||
|
f: F,
|
||||||
|
) -> impl TryStream<Ok = U, Error = E, Item = Result<U, E>> + Send
|
||||||
|
where
|
||||||
|
N: Into<Option<usize>>,
|
||||||
|
H: Into<Option<runtime::Handle>>,
|
||||||
|
F: Fn(Self::Ok) -> Result<U, E> + Clone + Send + 'static,
|
||||||
|
U: Send + 'static,
|
||||||
|
{
|
||||||
|
let n = n.into().unwrap_or_else(available_parallelism);
|
||||||
|
let h = h.into().unwrap_or_else(runtime::Handle::current);
|
||||||
|
self.broadn_and_then(n, move |val| {
|
||||||
|
let (h, f) = (h.clone(), f.clone());
|
||||||
|
async move { h.spawn_blocking(move || f(val)).map_err(E::from).await? }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue