pub struct PullFanIn { /* private fields */ }Expand description
A PULL endpoint that merges messages from a pool of PUSH workers.
Create one with bind, or bind a listener yourself and call
accept_workers when you need the bound port before
the workers connect (the bench peer does this to print its port).
Implementations§
Source§impl PullFanIn
impl PullFanIn
Sourcepub async fn bind(
addr: impl ToSocketAddrs,
n_workers: usize,
) -> Result<(TcpListener, Self)>
pub async fn bind( addr: impl ToSocketAddrs, n_workers: usize, ) -> Result<(TcpListener, Self)>
Bind to addr, accept n_workers PUSH connections, and return the
listener alongside the ready fan-in socket.
§Example
use monocoque::zmq::PullFanIn;
let (_listener, mut sink) = PullFanIn::bind("127.0.0.1:5558", 4).await?;
while let Ok(Some(result)) = sink.recv().await {
// process result
drop(result);
}Sourcepub async fn bind_with_options(
addr: impl ToSocketAddrs,
n_workers: usize,
options: SocketOptions,
) -> Result<(TcpListener, Self)>
pub async fn bind_with_options( addr: impl ToSocketAddrs, n_workers: usize, options: SocketOptions, ) -> Result<(TcpListener, Self)>
Like bind but applies options to every worker connection.
Sourcepub async fn accept_workers(
listener: &TcpListener,
n_workers: usize,
options: SocketOptions,
) -> Result<Self>
pub async fn accept_workers( listener: &TcpListener, n_workers: usize, options: SocketOptions, ) -> Result<Self>
Accept n_workers PUSH connections on an already-bound listener.
Useful when the bound address must be read (and announced) before the workers are allowed to connect.
Sourcepub async fn recv(&mut self) -> Result<Option<Vec<Bytes>>>
pub async fn recv(&mut self) -> Result<Option<Vec<Bytes>>>
Receive the next message from any worker.
Pops from the local buffer first and only waits on the channel when the
buffer is empty. Returns Ok(None) once every worker has disconnected and
both the buffer and channel have drained, mirroring PullSocket::recv on a
closed connection.
Sourcepub fn try_recv(&mut self) -> Result<Option<Vec<Bytes>>>
pub fn try_recv(&mut self) -> Result<Option<Vec<Bytes>>>
Try to receive a message without waiting.
Returns Ok(None) when nothing is buffered or queued, even if workers are
still connected. Use it to drain the sink after a recv.
Sourcepub async fn recv_batch(&mut self) -> Result<Option<Vec<Vec<Bytes>>>>
pub async fn recv_batch(&mut self) -> Result<Option<Vec<Vec<Bytes>>>>
Receive a burst of merged messages with a single .await.
Returns the locally buffered messages plus every batch already queued from
the worker readers, folded into one Vec. Blocks for at least one message
when nothing is ready yet. Returning a burst from one .await amortizes
the per-await cost for throughput-bound sinks; it is the fan-in counterpart
to PullSocket::recv_batch.
Returns Ok(None) once every worker has disconnected and nothing remains.
Auto Trait Implementations§
impl !RefUnwindSafe for PullFanIn
impl !UnwindSafe for PullFanIn
impl Freeze for PullFanIn
impl Send for PullFanIn
impl Sync for PullFanIn
impl Unpin for PullFanIn
impl UnsafeUnpin for PullFanIn
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more