AsyncTx

Struct AsyncTx 

Source
pub struct AsyncTx<T> { /* private fields */ }
Expand description

A single producer (sender) that works in an async context.

Additional methods in ChannelShared can be accessed through Deref.

AsyncTx can be converted into Tx via the From trait. This means you can have two types of senders, both within async and blocking contexts, for the same channel.

NOTE: AsyncTx is not Clone or Sync. If you need concurrent access, use MAsyncTx instead.

AsyncTx has a Send marker and can be moved to other coroutines. The following code is OK:

use crossfire::*;
async fn foo() {
    let (tx, rx) = spsc::bounded_async::<usize>(100);
    tokio::spawn(async move {
         let _ = tx.send(2).await;
    });
    drop(rx);
}

Because AsyncTx does not have a Sync marker, using Arc<AsyncTx> will lose the Send marker.

For your safety, the following code should not compile:

use crossfire::*;
use std::sync::Arc;
async fn foo() {
    let (tx, rx) = spsc::bounded_async::<usize>(100);
    let tx = Arc::new(tx);
    tokio::spawn(async move {
         let _ = tx.send(2).await;
    });
    drop(rx);
}

Implementations§

Source§

impl<T> AsyncTx<T>

Source

pub fn into_sink(self) -> AsyncSink<T>

Source

pub fn into_blocking(self) -> Tx<T>

Source§

impl<T: Unpin + Send + 'static> AsyncTx<T>

Source

pub fn send<'a>(&'a self, item: T) -> SendFuture<'a, T>

Sends a message. This method will await until the message is sent or the channel is closed.

This function is cancellation-safe, so it’s safe to use with timeout() and the select! macro. When a SendFuture is dropped, no message will be sent. However, the original message cannot be returned due to API limitations. For timeout scenarios, we recommend using AsyncTx::send_timeout(), which returns the message in a SendTimeoutError.

Returns Ok(()) on success.

Returns Err(SendError) if the receiver has been dropped.

Source

pub fn try_send(&self, item: T) -> Result<(), TrySendError<T>>

Attempts to send a message without blocking.

Returns Ok(()) when successful.

Returns Err(TrySendError::Full) if the channel is full.

Returns Err(TrySendError::Disconnected) if the receiver has been dropped.

Source

pub fn send_timeout<'a>( &'a self, item: T, duration: Duration, ) -> SendTimeoutFuture<'a, T, ()>

Available on crate features tokio or async_std only.

Sends a message with a timeout. Will await when channel is full.

The behavior is atomic: the message is either sent successfully or returned with error.

Returns Ok(()) when successful.

Returns Err(SendTimeoutError::Timeout) if the operation timed out. The error contains the message that failed to be sent.

Returns Err(SendTimeoutError::Disconnected) if the receiver has been dropped. The error contains the message that failed to be sent.

Source

pub fn send_with_timer<'a, F, R>( &'a self, item: T, fut: F, ) -> SendTimeoutFuture<'a, T, R>
where F: Future<Output = R> + 'static,

Sends a message with a custom timer function (from other async runtime).

The behavior is atomic: the message is either sent successfully or returned with error.

Returns Ok(()) when successful.

Returns Err(SendTimeoutError::Timeout) if the operation timed out. The error contains the message that failed to be sent.

Returns Err(SendTimeoutError::Disconnected) if the receiver has been dropped. The error contains the message that failed to be sent.

§Argument:
  • fut: The sleep function. It’s possible to wrap this function with cancelable handle, you can control when to stop polling. the return value of fut is ignore. We add generic R just in order to support smol::Timer.
§Example:
extern crate smol;
use std::time::Duration;
use crossfire::*;
async fn foo() {
    let (tx, rx) = mpmc::bounded_async::<usize>(10);
    match tx.send_with_timer(1, smol::Timer::after(Duration::from_secs(1))).await {
        Ok(_)=>{
            println!("message sent");
        }
        Err(SendTimeoutError::Timeout(_item))=>{
            println!("send timeout");
        }
        Err(SendTimeoutError::Disconnected(_item))=>{
            println!("receiver-side closed");
        }
    }
}

Methods from Deref<Target = ChannelShared<T>>§

Source

pub fn len(&self) -> usize

The number of messages in the channel.

Source

pub fn capacity(&self) -> Option<usize>

The capacity of the channel. Returns None for unbounded channels.

Source

pub fn is_empty(&self) -> bool

Returns true if the channel is empty.

Source

pub fn is_full(&self) -> bool

Returns true if the channel is full.

Source

pub fn is_disconnected(&self) -> bool

Returns true if all senders or receivers have been dropped.

Source

pub fn get_tx_count(&self) -> usize

Returns the number of senders for the channel.

Source

pub fn get_rx_count(&self) -> usize

Returns the number of receivers for the channel.

Source

pub fn get_wakers_count(&self) -> (usize, usize)

Returns the number of wakers for senders and receivers. For debugging purposes.

Trait Implementations§

Source§

impl<T> AsRef<ChannelShared<T>> for AsyncTx<T>

Source§

fn as_ref(&self) -> &ChannelShared<T>

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<T: Unpin + Send + 'static> AsyncTxTrait<T> for AsyncTx<T>

Source§

fn clone_to_vec(self, count: usize) -> Vec<Self>

Source§

fn try_send(&self, item: T) -> Result<(), TrySendError<T>>

Try to send message, non-blocking Read more
Source§

fn send<'a>(&'a self, item: T) -> SendFuture<'a, T>

Send message. Will await when channel is full. Read more
Source§

fn send_timeout<'a>( &'a self, item: T, duration: Duration, ) -> SendTimeoutFuture<'a, T, ()>

Available on crate features tokio or async_std only.
Waits for a message to be sent into the channel, but only for a limited time. Will await when channel is full. Read more
Source§

fn send_with_timer<'a, F, R>( &'a self, item: T, fut: F, ) -> SendTimeoutFuture<'a, T, R>
where F: Future<Output = R> + 'static,

Sends a message with a custom timer function. Will await when channel is full. Read more
Source§

fn len(&self) -> usize

The number of messages in the channel at the moment
Source§

fn capacity(&self) -> Option<usize>

The capacity of the channel, return None for unbounded channel.
Source§

fn is_empty(&self) -> bool

Whether channel is empty at the moment
Source§

fn is_full(&self) -> bool

Whether the channel is full at the moment
Source§

fn is_disconnected(&self) -> bool

Return true if the other side has closed
Source§

impl<T> Debug for AsyncTx<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Deref for AsyncTx<T>

Source§

type Target = ChannelShared<T>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &ChannelShared<T>

Dereferences the value.
Source§

impl<T> Display for AsyncTx<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Drop for AsyncTx<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T: Unpin + Send + 'static> From<AsyncTx<T>> for AsyncSink<T>

Source§

fn from(tx: AsyncTx<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<AsyncTx<T>> for Tx<T>

Source§

fn from(value: AsyncTx<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<MAsyncTx<T>> for AsyncTx<T>

Source§

fn from(tx: MAsyncTx<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<Tx<T>> for AsyncTx<T>

Source§

fn from(value: Tx<T>) -> Self

Converts to this type from the input type.
Source§

impl<T: Send> Send for AsyncTx<T>

Auto Trait Implementations§

§

impl<T> Freeze for AsyncTx<T>

§

impl<T> !RefUnwindSafe for AsyncTx<T>

§

impl<T> !Sync for AsyncTx<T>

§

impl<T> Unpin for AsyncTx<T>

§

impl<T> !UnwindSafe for AsyncTx<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.