Skip to main content

ActorRefStrong

Struct ActorRefStrong 

Source
pub struct ActorRefStrong<M>
where M: MessageBounds,
{ /* private fields */ }
Expand description

A version of ActorRef that prevents the target from being deallocated

Holding this kind of reference increases performance slightly, compared to the normal ActorRef. However, one must be careful not to leave strong references lying around when not needed anymore, as they prevent the target component from being deallocated, potentially causing memory creep.

Should be created via hold.

It is recommended to upgrade a normal actor reference to this variant, if many messages will be sent in a loop to it. After the loop, the strong reference can be dropped again.

Implementations§

Source§

impl<M> ActorRefStrong<M>
where M: MessageBounds,

Source

pub fn tell<I>(&self, v: I)
where I: Into<M>,

Send message v to the actor instance referenced by this actor reference

Source

pub fn ask_with<R, F>(&self, f: F) -> KFuture<R>
where R: Send, F: FnOnce(KPromise<R>) -> M,

Helper to create messages that expect a response via a future instead of a message

§Example
use kompact::prelude::*;
use std::time::Duration;

#[derive(ComponentDefinition)]
struct AskComponent {
    ctx: ComponentContext<Self>
}



impl Actor for AskComponent {
    type Message = Ask<u64, String>;

    fn receive_local(&mut self, msg: Self::Message) -> HandlerResult {
        msg.complete(|num| {
            format!("{}", num)
        })
        .expect("completion");
        Handled::OK
    }

}

let system = KompactConfig::default().build().wait().expect("system");
let c = system.create(AskComponent::new);
let strong_ref = c.actor_ref().hold().expect("live ref");

let start_f = system.start_notify(&c);
start_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("component start");

let response_f = strong_ref.ask_with(Ask::of(42u64));
let response = response_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("response");
assert_eq!("42".to_string(), response);
Source

pub fn weak_ref(&self) -> ActorRef<M>

Downgrade this strong reference to a “normal” actor reference

Source§

impl<Request, Response> ActorRefStrong<Ask<Request, Response>>
where Request: MessageBounds, Response: Send + Debug + 'static,

Source

pub fn ask(&self, request: Request) -> KFuture<Response>

Helper to create messages that expect a response via a future instead of a message

§Example
use kompact::prelude::*;
use std::time::Duration;

#[derive(ComponentDefinition)]
struct AskComponent {
    ctx: ComponentContext<Self>
}



impl Actor for AskComponent {
    type Message = Ask<u64, String>;

    fn receive_local(&mut self, msg: Self::Message) -> HandlerResult {
        msg.complete(|num| {
            format!("{}", num)
        })
        .expect("completion");
        Handled::OK
    }

}

let system = KompactConfig::default().build().wait().expect("system");
let c = system.create(AskComponent::new);
let strong_ref = c.actor_ref().hold().expect("live ref");

let start_f = system.start_notify(&c);
start_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("component start");

let response_f = strong_ref.ask(42u64);
let response = response_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("response");
assert_eq!("42".to_string(), response);

Trait Implementations§

Source§

impl<M> ActorRefFactory for ActorRefStrong<M>
where M: MessageBounds,

Source§

type Message = M

The type of messages carried by references produced by this factory
Source§

fn actor_ref(&self) -> ActorRef<M>

Returns the associated actor reference
Source§

impl<M> Clone for ActorRefStrong<M>
where M: MessageBounds,

Source§

fn clone(&self) -> ActorRefStrong<M>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<M> Debug for ActorRefStrong<M>
where M: MessageBounds,

Source§

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

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

impl<M> Display for ActorRefStrong<M>
where M: MessageBounds,

Source§

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

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

impl<M> DynActorRefFactory for ActorRefStrong<M>
where M: MessageBounds,

Available on crate feature distributed only.
Source§

fn dyn_ref(&self) -> DynActorRef

Returns a version of an actor ref that can only be used for network messages, but not for typed messages.
Source§

impl<M> PartialEq for ActorRefStrong<M>
where M: MessageBounds,

Source§

fn eq(&self, other: &ActorRefStrong<M>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

§

impl<M> Freeze for ActorRefStrong<M>

§

impl<M> !RefUnwindSafe for ActorRefStrong<M>

§

impl<M> Send for ActorRefStrong<M>

§

impl<M> Sync for ActorRefStrong<M>

§

impl<M> Unpin for ActorRefStrong<M>

§

impl<M> UnsafeUnpin for ActorRefStrong<M>

§

impl<M> !UnwindSafe for ActorRefStrong<M>

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DispatchEvent for T
where T: Any + Send + Debug,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any + Send>

Convert this event into an erased Any payload for downcasting.
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<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<M, T, A> Receiver<T> for A
where T: Debug + 'static, M: From<T> + MessageBounds, A: ActorRefFactory<Message = M>,

Source§

fn recipient(&self) -> Recipient<T>

Produce a recipient for T
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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> TryClone for T
where T: Clone,

Source§

fn try_clone(&self) -> Result<T, SerError>

Tries to produce a copy of self or returns an error
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> Erased for T

Source§

impl<M> MessageBounds for M
where M: Debug + Send + 'static,