Supervisor

Struct Supervisor 

Source
pub struct Supervisor { /* private fields */ }
Expand description

A supervisor is a process which supervises other processes, which we refer to as child processes. Supervisors are used to build a hierarchical process structure called a supervision tree. Supervision trees provide fault-tolerance and encapsulate how our applications start and shutdown.

Implementations§

Source§

impl Supervisor

Source

pub const fn new() -> Self

Constructs a new instance of Supervisor with no children.

Source

pub fn with_children<T: IntoIterator<Item = ChildSpec>>(children: T) -> Self

Constructs a new instance of Supervisor with the given children.

Examples found in repository?
examples/supervisor.rs (line 38)
30    async fn start(&self) -> Result<Pid, ExitReason> {
31        // Spawn two instances of `MyServer` with their own unique ids.
32        let children = [
33            MyServer::new().child_spec().id("server1"),
34            MyServer::new().child_spec().id("server2"),
35        ];
36
37        // Restart only the terminated child.
38        Supervisor::with_children(children)
39            .strategy(SupervisionStrategy::OneForOne)
40            .start_link(SupervisorOptions::new())
41            .await
42    }
More examples
Hide additional examples
examples/registry.rs (line 77)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub fn add_child(self, child: ChildSpec) -> Self

Adds a child to this Supervisor.

Source

pub fn child_spec(self, options: SupervisorOptions) -> ChildSpec

Builds a child specification for this Supervisor process.

Source

pub const fn strategy(self, strategy: SupervisionStrategy) -> Self

Sets the supervision strategy for the Supervisor.

Examples found in repository?
examples/supervisor.rs (line 39)
30    async fn start(&self) -> Result<Pid, ExitReason> {
31        // Spawn two instances of `MyServer` with their own unique ids.
32        let children = [
33            MyServer::new().child_spec().id("server1"),
34            MyServer::new().child_spec().id("server2"),
35        ];
36
37        // Restart only the terminated child.
38        Supervisor::with_children(children)
39            .strategy(SupervisionStrategy::OneForOne)
40            .start_link(SupervisorOptions::new())
41            .await
42    }
More examples
Hide additional examples
examples/registry.rs (line 78)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub const fn auto_shutdown(self, auto_shutdown: AutoShutdown) -> Self

Sets the behavior to use when a significant process exits.

Source

pub const fn max_restarts(self, max_restarts: usize) -> Self

Sets the maximum number of restarts allowed in a time frame.

Defaults to 3.

Source

pub const fn max_duration(self, max_duration: Duration) -> Self

Sets the time frame in which max_restarts applies.

Defaults to 5s.

Source

pub async fn start(self, options: SupervisorOptions) -> Result<Pid, ExitReason>

Creates a supervisor process not apart of a supervision tree.

This will not return until all of the child processes have been started.

Creates a supervisor process as part of a supervision tree.

For example, this function ensures that the supervisor is linked to the calling process (its supervisor).

This will not return until all of the child processes have been started.

Examples found in repository?
examples/supervisor.rs (line 40)
30    async fn start(&self) -> Result<Pid, ExitReason> {
31        // Spawn two instances of `MyServer` with their own unique ids.
32        let children = [
33            MyServer::new().child_spec().id("server1"),
34            MyServer::new().child_spec().id("server2"),
35        ];
36
37        // Restart only the terminated child.
38        Supervisor::with_children(children)
39            .strategy(SupervisionStrategy::OneForOne)
40            .start_link(SupervisorOptions::new())
41            .await
42    }
More examples
Hide additional examples
examples/registry.rs (line 79)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub async fn count_children<T: Into<Dest>>( supervisor: T, ) -> Result<SupervisorCounts, SupervisorError>

Returns SupervisorCounts containing the counts for each of the different child specifications.

Source

pub async fn start_child<T: Into<Dest>>( supervisor: T, child: ChildSpec, ) -> Result<Option<Pid>, SupervisorError>

Adds the child specification to the Supervisor and starts that child.

Source

pub async fn terminate_child<T: Into<Dest>, I: Into<String>>( supervisor: T, child_id: I, ) -> Result<(), SupervisorError>

Terminates the given child identified by child_id.

The process is terminated, if there’s one. The child specification is kept unless the child is temporary.

A non-temporary child process may later be restarted by the Supervisor.

The child process can also be restarted explicitly by calling restart_child. Use delete_child to remove the child specification.

Source

pub async fn restart_child<T: Into<Dest>, I: Into<String>>( supervisor: T, child_id: I, ) -> Result<Option<Pid>, SupervisorError>

Restarts a child identified by child_id.

The child specification must exist and the corresponding child process must not be running.

Note that for temporary children, the child specification is automatically deleted when the child terminates, and thus it is not possible to restart such children.

Source

pub async fn delete_child<T: Into<Dest>, I: Into<String>>( supervisor: T, child_id: I, ) -> Result<(), SupervisorError>

Deletes the child specification identified by child_id.

The corrosponding child process must not be running, use terminate_child to terminate it if it’s running.

Source

pub async fn which_children<T: Into<Dest>>( supervisor: T, ) -> Result<Vec<SupervisorChildInfo>, SupervisorError>

Returns a list with information about all children of the given Supervisor.

Trait Implementations§

Source§

impl Clone for Supervisor

Source§

fn clone(&self) -> Supervisor

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Default for Supervisor

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl GenServer for Supervisor

Source§

type Message = SupervisorMessage

The message type that this server will use.
Source§

async fn init(&mut self) -> Result<(), ExitReason>

Invoked when the server is started. start_link or start will block until it returns.
Source§

async fn terminate(&mut self, _reason: ExitReason)

Invoked when the server is about to exit. It should do any cleanup required. Read more
Source§

async fn handle_cast( &mut self, message: Self::Message, ) -> Result<(), ExitReason>

Invoked to handle asynchronous cast messages.
Source§

async fn handle_call( &mut self, message: Self::Message, _from: From, ) -> Result<Option<Self::Message>, ExitReason>

Invoked to handle synchronous call messages. call will block until a reply is received (unless the call times out or nodes are disconnected). Read more
Source§

async fn handle_info( &mut self, info: Message<Self::Message>, ) -> Result<(), ExitReason>

Invoked to handle all other messages.
Source§

fn start( self, options: GenServerOptions, ) -> impl Future<Output = Result<Pid, ExitReason>> + Send

Starts a GenServer process without links.
Starts a GenServer process linked to the current process.
Source§

fn stop<T: Into<Dest>>( server: T, reason: ExitReason, timeout: Option<Duration>, ) -> impl Future<Output = Result<(), ExitReason>>

Synchronously stops the server with the given reason. Read more
Source§

fn cast<T: Into<Dests>>(servers: T, message: Self::Message)

Casts a request to the servers without waiting for a response. Read more
Source§

fn cast_after<T: Into<Dests>>( servers: T, message: Self::Message, duration: Duration, ) -> Reference

Casts a request to the servers after the given duration without waiting for a response. Read more
Source§

fn call<T: Into<Dest>>( server: T, message: Self::Message, timeout: Option<Duration>, ) -> impl Future<Output = Result<Self::Message, CallError>> + Send

Makes a synchronous call to the server and waits for it’s reply. Read more
Source§

fn reply(from: From, message: Self::Message)

Replies to a client. 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> 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> 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> Same for T

Source§

type Output = T

Should always be Self
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, 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<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