6 releases
0.0.6 | Mar 5, 2021 |
---|---|
0.0.5 | Mar 5, 2021 |
0.0.2 | Jan 30, 2021 |
#1697 in Asynchronous
13KB
299 lines
tractor
Actor framework for Rust, modelled after Pony's actors:
-
Actor
s cannot deadlock! -
Send
ing a message to anActor
can never fail. -
No
async
inActor
s. Behaviors cannot block. -
Actor
s are garbage collected. -
The implemention of
tractor
is rather simple compared against other Actor implementations in Rust. -
It uses
tokio
but was usingasync_std
in the past.
Example
In Cargo.toml
add tractor = "*"
and tokio = "1.2.0"
.
use tractor::prelude::*;
pub struct Adder {
sum: usize,
}
#[actor(derive_hooks)]
impl Adder {
fn inc(&mut self) {
self.sum += 1;
}
fn add(&mut self, num: usize) {
self.sum += num;
}
}
fn actor_main() {
let adder: Addr<Adder> = Adder { sum: 0 }.start();
/// This sends the `inc` message to the actor.
adder.inc();
/// This sends the `add` message to the actor.
adder.add(42);
}
fn main() {
ActorSystem::run_to_completion(actor_main);
}
More details
-
Actor
s have unbounded mailboxes andsend
is non-blocking. -
Actor
s cannot be manually stopped. They terminate as soon as no further reference to them exists and their mailbox is empty. This implies that sending a message to anActor
can never fail except for running out of memory. To avoid overloading of anActor
you can check it's current length of it's mailbox. -
The behaviors of an
Actor
have no return value! As such,Actor
s do not support "waiting" for a result. To "simulate" Request/Response, pass theActor
s address in the message and respond to it. -
The behaviors of an
Actor
are NOTasync fn
s!Async
would imply that the execution can "halt". Use an async actor (ActorBehaviorAsync
/ActorHooksAsync
) instead. -
NOTE: Any
Actor
cycles will defeat the garbage collection ofActor
s.
Dependencies
~2.8–9MB
~78K SLoC