Skip to main content

Crate aetherflow

Crate aetherflow 

Source
Expand description

§aetherflow-runtime — マルチコア thread-per-core actor ランタイム

design.md の 4 本柱を実装:

  • ①型による隔離 / ②zero-copy move → ActorRef::try_sendA::Messagemove で取る。 use-after-send はコンパイルエラー(E0382)。
  • ③物理配置 → Systemコアごとに 1 スレッドを立ててピン留めし、各スレッドが そのコアに割り当てられた多数の actor を run-to-completion で回す。mailbox はコアを跨がない lock-free キュー(mpsc)。
  • ④work-stealing 排除 → Tokio 不使用。actor はコア間を移動しない(静的配置)。

§thread-per-core であって thread-per-actor ではない

1 コア = 1 OS スレッドが多数の actor を回す。actor ごとにスレッドを立てない(それは thread-per-actor でスケールしない)。同一コアの異種 actor は型消去して 1 スレッドで回し、 送信は typed な ActorRef のまま — capability-mapping §7 の「制御面=erased / データ面=typed」。

§使い方

use aetherflow::{System, Actor};
use std::sync::mpsc;

struct Adder { sum: u64, out: mpsc::Sender<u64> }
impl Actor for Adder {
    type Message = u64;
    fn handle(&mut self, msg: u64) { self.sum += msg; self.out.send(self.sum).unwrap(); }
}

let sys = System::with_cores(2);
let (out, results) = mpsc::channel();
let addr = sys.spawn_on(0, Adder { sum: 0, out });   // コア 0 に配置
addr.send_blocking(10);
addr.send_blocking(5);
drop(addr);              // 送信端が全て落ちると、その actor はコアから外れる
sys.shutdown();          // 全コアを停止して join
assert_eq!(results.recv().unwrap(), 10);
assert_eq!(results.recv().unwrap(), 15);

§隔離はコンパイル時に強制される

use aetherflow::{System, Actor};
struct Order { qty: u32 }
struct E;
impl Actor for E { type Message = Order; fn handle(&mut self, m: Order) { let _ = m.qty; } }
let sys = System::with_cores(1);
let addr = sys.spawn_on(0, E);
let order = Order { qty: 100 };
addr.try_send(order).ok();     // move で移譲
println!("{}", order.qty);     // use of moved value `order` (E0382):コンパイル不能

Modules§

pinning
コア配置(best-effort)。OS ごとに「できる範囲で最も良い」ことをする。

Structs§

ActorRef
actor のメールボックスへの送信ハンドル(MPSC の生産者)。Clone 可能 = 複数送信元 OK。
LatencySnapshot
[LatencyHistogram::snapshot] の結果(単位は ns、分位はバケット粒度の近似)。
Responder
一度だけ返信できる線形トークン(iso 的)。reply が self を consume する。
SpawnBuilder
System::build が返す spawn ビルダー。上級ノブを opt-in で積む(既定は単純 spawn 相当)。
System
マルチコア actor ランタイム。

Enums§

AskError
ask の失敗理由。
IdleStrategy
メッセージが無いときのコアスレッドの振る舞い(レイテンシ ↔ CPU/tail 堅牢性のトレードオフ)。
RestartPolicy
supervised actor の再起動方針。無制限 restart は暴走ループになりうるので、既定は上限つき。
SendError
ブロッキング送信 send_blocking の失敗理由。満杯は待つので、残るのは Closed のみ。
TrySendError
非ブロッキング送信 try_send の失敗理由。いずれも元のメッセージを返すので、 呼び出し側は再ルーティング・永続化・ログ記録ができる。

Traits§

Actor
型付き actor。メッセージ型は固定で Send(= sendable な iso/val を型で要求)。