Struct acto::AcTokio

source ·
pub struct AcTokio(/* private fields */);
Available on crate feature tokio only.
Expand description

Owned handle to an AcTokioRuntime.

Dropping this handle will abort all actors spawned by this runtime.

Implementations§

source§

impl AcTokio

source

pub fn new(name: impl Into<String>, num_threads: usize) -> Result<Self>

Create a new AcTokio runtime with the given name and number of threads.

let rt = AcTokio::new("test", 1).unwrap();

let actor = rt.spawn_actor("test", |mut ctx| async move {
    let ActoInput::<String, ()>::Message(name) = ctx.recv().await else { return };
    println!("Hello, {}!", name);
});

// Send a message to the actor, after which it will terminate.
actor.me.send("world".to_owned());
// Wait for the actor to terminate.
rt.with_rt(|rt| rt.block_on(actor.handle.join())).unwrap();

In the above example the last step is crucial, without it nothing may be printed. The following demonstrates that this object owns the tokio runtime:

use acto::{AcTokio, ActoRuntime, ActoCell};

let flag = Arc::new(AtomicBool::new(false));

// This serves as a drop detector so we know the actor was killed.
struct X(Arc<AtomicBool>);
impl Drop for X {
    fn drop(&mut self) {
        self.0.store(true, Ordering::Relaxed);
    }
}
let x = X(flag.clone());

let tokio = AcTokio::new("test", 1).unwrap();
tokio.spawn_actor("test", move |mut ctx: ActoCell<(), _>| async move {
    // make sure to move the drop detector inside this scope
    let _y = x;
    // wait forever
    loop { ctx.recv().await; }
});

// this will synchronously await termination of all actors and of the threads that run them
drop(tokio);

// verify that indeed the `_y` was dropped inside the actor
assert!(flag.load(Ordering::Relaxed));
source

pub fn from_handle(name: impl Into<String>, handle: Handle) -> Self

Create a new AcTokio runtime from an existing tokio::runtime::Handle.

This is useful if you want to use an existing tokio runtime, for example if you want to use [acto] in a library. Dropping this value will not abort the actors spawned by this runtime, but it will prevent new actors from being spawned, so make sure to keep it around long enough!

Methods from Deref<Target = AcTokioRuntime>§

source

pub fn with_rt<U>(&self, f: impl FnOnce(&Handle) -> U) -> Option<U>

Perform a task using the underlying runtime.

Beware that while this function is running, dropping the AcTokio handle will block until the function is finished. Returns None if the runtime has been dropped.

Trait Implementations§

source§

impl Deref for AcTokio

§

type Target = AcTokioRuntime

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl Drop for AcTokio

source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

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> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<T, U> TryFrom<U> for T
where U: Into<T>,

§

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>,

§

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.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more